Почему сигнатуру конструктора можно переопределять? Для чего эта условность? Код ниже будет работать для конструктора. Для любого другого метода - нет, и это разумно потомок должен реализовать метод родителя по-другому, а не делать полностью противоположное действиеclass Car { protected $engine; protected $wheels; public function __construct(Engine $engine, Wheels $wheels) { $this->engine = $engine; $this->wheels = $wheels; } public function engineStart() { $this->engine->start(); } } class Bmw extends Car { public function __construct(Wheels $wheels) // ! damn, its OK ! { $this->wheels = $wheels; } } (new Bmw)->engineStart(); // Trying to call method on null
Сигнатуру конструктора можно переопределять, потому что это позволяет создавать дочерние классы с альтернативными способами инициализации объектов. Например, в случае с классами Car и Bmw, Bmw может иметь специфический способ инициализации, который отличается от общего для всех автомобилей.
В данном случае код не будет работать для конструктора в классе Bmw из-за того, что при создании объекта Bmw не передаются параметры Engine, который ожидает конструктор класса Car. Таким образом, при попытке вызвать метод engineStart() у объекта Bmw, свойство $engine остается неинициализированным и метод вызывается на null, что приводит к ошибке.
Чтобы исправить это, можно либо передать параметры Engine и Wheels при создании объекта Bmw, либо изменить конструктор в классе Bmw, чтобы он правильно инициализировал объект.
Сигнатуру конструктора можно переопределять, потому что это позволяет создавать дочерние классы с альтернативными способами инициализации объектов. Например, в случае с классами Car и Bmw, Bmw может иметь специфический способ инициализации, который отличается от общего для всех автомобилей.
В данном случае код не будет работать для конструктора в классе Bmw из-за того, что при создании объекта Bmw не передаются параметры Engine, который ожидает конструктор класса Car. Таким образом, при попытке вызвать метод engineStart() у объекта Bmw, свойство $engine остается неинициализированным и метод вызывается на null, что приводит к ошибке.
Чтобы исправить это, можно либо передать параметры Engine и Wheels при создании объекта Bmw, либо изменить конструктор в классе Bmw, чтобы он правильно инициализировал объект.