A alternativa a usar herança indiscriminadamente é a composição. Em vez de dizer que um objeto "é um" (herança), você faz com que ele "tenha um" (composição). Isso permite que você reutilize o comportamento de outras classes sem herdar métodos indesejados.
Vamos criar uma classe Carro que tem um motor (Motor). Em vez de herdar o motor, o carro terá um motor como parte de sua composição.
<?php
class Motor {
private $potencia;
public function __construct($potencia) {
$this->potencia = $potencia;
}
public function ligar() {
return "Motor de " . $this->potencia . " cavalos ligado!";
}
}
// Definindo a classe Carro que "tem um" Motor
class Carro {
private $motor;
public function __construct(Motor $motor) {
$this->motor = $motor; // O carro "tem um" motor
}
public function ligarCarro() {
return $this->motor->ligar();
}
}
$meuMotor = new Motor(150);
// Criando um objeto do tipo Carro, passando o motor
$meuCarro = new Carro($meuMotor);
// Ligando o carro (que internamente liga o motor)
echo $meuCarro->ligarCarro();
?>