Well, the reason for the fault is clear:
PHP reads cars.php
The first line of cars.php it encounters tells it to start reading persons.php - it hasn't "required" persons.php yet, so it does so now.
The first line of persons.php it encounters tells it to start reading cars.php - it hasn't "required" cars.php yet, so it does so now.
Then it declares the TCar class that is described in the included cars.php
Then it declares the TPerson class that is described in the included persons.php
Then it attempts to declare the TCar class that is described in the original cars.php
But even if you get around this, you're in trouble:
$car = new TCar();
As part of the new TCar object, you create a new TPerson.
As part of this new TPerson object, you create a new TCar.
As part of this new TCar object, you create a new TPerson.
As part of this new TPerson object, you create a new TCar.
...ad infinitum.
Solution: don't create the objects in the constructor. Remember, you don't need to specify in advance what type any variable is. If you want $my->$car to contain a car object, say $my->$car = new TCar() when the occasion arises.