Возьмем следующий пример:
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
Нет, конструктор родительского класса не вызывается, если дочерний класс определяет конструктор.
Из конструктора вашего дочернего класса вы должны вызвать конструктор родительского класса:
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 */