Antes pensaba que al llamar al constructor de una clase derivada, los miembros de la clase base no se pueden usar antes de que se llame al constructor de la clase base, porque el objeto de la clase base aún no se ha construido y los miembros no existen, pero Encontré en la siguiente prueba, antes de llamar al constructor de la clase base, los miembros en la clase base ya existen, y el constructor de la clase base simplemente cambia el valor de los miembros en la clase base:
class base {
public $i = 4;
public function func() {
print("in base's func" . PHP_EOL);
}
public function __construct() {
print("in base's construct" . PHP_EOL);
$this->i = 3;
}
}
class derive extends base {
public function __construct() {
print("start derive's constructor" . PHP_EOL);
self::func();
print("before base's construct: \$i = $this->i" . PHP_EOL);
parent::__construct();
print("after base's construct: \$i = $this->i" . PHP_EOL);
}
}
$deriveObj = new derive();
Ejecute el código anterior:
se puede ver que las funciones miembro y los miembros de datos de la clase base se pueden llamar antes de que se ejecute el constructor de la clase base.