devastation_kvlt
@devastation_kvlt

Почему 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 в качестве переданных параметров.

Как можно сделать такое уточнение и что-бы валидатору понравилось моё решение?
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
@mistergonza
PHP6 evangelist
Для абстрактных методов в классах потомках область видимости может варьироваться (она должна быть такой же или менее строгой), а вот сигнатуры методов должны совпадать. В интерфейсах также сигнатуры методов должны совпадать.

Как вариант можно сделать проверку внутри реализации метода дочернего класса через instanceof.

P.S. Судя по названию классов вы случаем там не ZF2 ковыряете?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Arik
Может попробовать указывать не класса, а интерфейсы?
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Пока нельзя. Наследник должен строго соответствовать контракту родителя.
https://wiki.php.net/rfc/generics Under Discussion
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы