Почему сигнатуру конструктора можно переопределять? Для чего эта условность? Код ниже будет работать для конструктора.
Для любого другого метода - нет, и это разумно потомок должен реализовать метод родителя по-другому, а не делать полностью противоположное действие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

19 Сен 2019 в 19:51
304 +1
0
Ответы
1

Сигнатуру конструктора можно переопределять, потому что это позволяет создавать дочерние классы с альтернативными способами инициализации объектов. Например, в случае с классами Car и Bmw, Bmw может иметь специфический способ инициализации, который отличается от общего для всех автомобилей.

В данном случае код не будет работать для конструктора в классе Bmw из-за того, что при создании объекта Bmw не передаются параметры Engine, который ожидает конструктор класса Car. Таким образом, при попытке вызвать метод engineStart() у объекта Bmw, свойство $engine остается неинициализированным и метод вызывается на null, что приводит к ошибке.

Чтобы исправить это, можно либо передать параметры Engine и Wheels при создании объекта Bmw, либо изменить конструктор в классе Bmw, чтобы он правильно инициализировал объект.

19 Апр 2024 в 21:25
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир