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