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

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

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

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

19 Апр в 21:25
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир