Одно слово точно описывает ситуацию.
Переопределение
Что происходит, когда родитель имеет метод, такой как __construct
, а дочерний класс делаетне имеет этого метода, когда метод вызывается в дочернем классе, он вызывает метод parent.
Например:
class Parent
{
public function start(){}
}
class Child extends Parent
{
}
, если я вызываю метод start в классе Child, еговыполняет Parent::Start()
, но если у класса Child есть метод с именем Start()
, он будет вызываться как Overriding родительская версия.
Каждый класс имеет метод конструктора и phpвыполняет это для компиляции класса в объект, теперь, если у вас есть метод с именем __construct()
в классе, PHP вызывает внутреннюю конструкцию, которая компилирует класс, а затем вызывает конструктор переопределения.
Если вы делаетене имеет __construct
метода в дочернем классе PHP выполняет родительский __construct
Это причина, почему вы получаете 2 x Test
в вашей инициализации объекта.
Единственный тиЕсли вы используете parent:__cosntruct()
, если ваш дочерний класс требует определенного пользователем конструктора, вы явно вызываете родительскую конструкцию для подготовки родительского объекта.
Например:
class Parent
{
public function __construct()
{
//Do work on Parent Class
}
}
class Child extends Parent
{
public function __construct()
{
//Do Work on Child Class
parent::__construct();
}
}
Причина, по которой вам следует вызывать только родительский конструктор внутри дочернего конструктора, а не дочерний метод, заключается в том, что конструкторы должны вызываться только один раз, таким образом это обеспечивается.