Почему type hint ругается на наследника? Не могу понять одну вещь:
Есть абстрактный класс Model, у него наследники Employee и Department.
Есть абстрактный класс TableDataGateway, у него наследники EmployeeTDGW и DepartmentTDGW
Я в классе TableDataGateway пишу: abstract public function add(Model $object); - подразумевая, что можно передавать только Model и её наследников
В дочерних классах я хочу видеть что-то типа public function add(Department $department) - уточняю, что не любой Model, а только Department
Но выскакивает warning кричащий о несоответствии типов. Пришлось в наследниках так-же прописывать Model в качестве переданных параметров.
Как можно сделать такое уточнение и что-бы валидатору понравилось моё решение?

21 Авг 2019 в 07:02
172 +1
0
Ответы
1

Проблема здесь в том, что PHP не поддерживает конкретные типы для аргументов методов в наследниках. В данном случае, вы пытаетесь использовать тип Department вместо Model в методе add, что PHP не позволяет сделать.

Чтобы обойти эту проблему, вам придется использовать интерфейсы вместо конкретных классов. Вы можете создать интерфейс, который будет имплементировать все ваши модели, и использовать его в качестве типа аргумента в методе add.

Например, вы можете создать интерфейс ModelInterface и имплементировать его в классах Employee и Department:

interface ModelInterface {
// общие методы для всех моделей
}
class Employee extends Model implements ModelInterface {
// реализация класса Employee
}
class Department extends Model implements ModelInterface {
// реализация класса Department
}

Затем вы можете изменить ваш метод add в классе TableDataGateway на:

abstract public function add(ModelInterface $object);

И в наследниках EmployeeTDGW и DepartmentTDGW использовать тип ModelInterface для аргумента метода add:

public function add(ModelInterface $model) {
// реализация метода
}

Таким образом, вы сможете уточнить тип аргумента метода add в наследниках, используя интерфейс вместо конкретного класса.

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