Являются ли конструкторы абстрактного класса неявным образом вызваны при создании экземпляра производного класса?

Возьмем следующий пример:

abstract class Base { function __construct() { echo 'Base __construct<br/>'; } } class Child extends Base { function __construct() { echo 'Child __construct<br/>'; } } $c = new Child(); 

Исходя из фона C #, я ожидаю, что вывод будет

Базовая __конструкция
Ребенок __construct

Однако фактический результат

Ребенок __construct

Related of "Являются ли конструкторы абстрактного класса неявным образом вызваны при создании экземпляра производного класса?"

Нет, конструктор родительского класса не вызывается, если дочерний класс определяет конструктор.

Из конструктора вашего дочернего класса вы должны вызвать конструктор родительского класса:

 parent::__construct(); 

Передача его параметров, если это необходимо.

Как правило, вы будете делать это в начале конструктора дочернего класса, прежде чем какой-либо конкретный код; это означает, что в вашем случае у вас будет:

 class Child extends Base { function __construct() { parent::__construct(); echo 'Child __construct<br/>'; } } 

И, для справки, вы можете взглянуть на эту страницу руководства по PHP: конструкторы и деструкторы – она ​​заявляет (цитирует) :

Примечание. Родительские конструкторы не называются неявно, если дочерний класс определяет конструктор.
Чтобы запустить родительский конструктор, требуется вызов parent::__construct() в дочернем конструкторе.

Ну, я просто нашел это в документах :

Примечание. Родительские конструкторы не называются неявно, если дочерний класс определяет конструктор. Чтобы запустить родительский конструктор, требуется вызов parent :: __ construct () в дочернем конструкторе.

Если вам нужно то же поведение, что и C #, то есть родительский конструктор всегда выполняется перед дочерним конструктором, вы можете создать поддельный класс конструктора для ваших дочерних классов и объявить его абстрактной функцией в своем абстрактном родительском классе.

Например

 abstract class Test{ abstract public function __childconstruct(); public function __construct(){ echo "SOME CODE".PHP_EOL; $this->__childconstruct(); } } class TestExtended extends Test{ public function __childconstruct(){ echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL; } } $a = new TestExtended(); /* SOME CODE SOME OTHER CODE FROM EXTENDED CLASS */