How can one ensure clean object-oriented programming practices when using classes as member variables in PHP?

To ensure clean object-oriented programming practices when using classes as member variables in PHP, it is important to follow the principles of encapsulation and abstraction. This means that member variables should be declared as private or protected to restrict direct access, and getter and setter methods should be used to interact with these variables. This helps to maintain data integrity and makes the code more maintainable and easier to understand.

class Car {
    private $engine;

    public function __construct(Engine $engine) {
        $this->engine = $engine;
    }

    public function getEngine(): Engine {
        return $this->engine;
    }

    public function setEngine(Engine $engine): void {
        $this->engine = $engine;
    }
}

class Engine {
    private $power;

    public function __construct(int $power) {
        $this->power = $power;
    }

    public function getPower(): int {
        return $this->power;
    }

    public function setPower(int $power): void {
        $this->power = $power;
    }
}

$engine = new Engine(200);
$car = new Car($engine);

echo $car->getEngine()->getPower(); // Output: 200