Есть ли возможность создать интерфейсную функцию в PHP, где параметр должен быть объектом, но не указывается, каким объектом он должен быть?
Теперь мой код выглядит так:
interface Container {
public static function add(\Employee $element);
}
Прямо сейчас я могу просто реализовать функцию с параметром, который требует экземпляра от «Сотрудника». Когда я сейчас реализую это в классе, это выглядит так:
class EmployeeContainer implements Container {
public static function add(\Employee $element) {
$pnr = $element->getPNR();
}
}
Когда я создаю другой класс, который реализует контейнер и устанавливает требуемый объект, например, на Trainee, компилятор PHP выдает ошибку:
class TraineeContainer implements Container {
public static function add(\Trainee $element) {
$pnr = $element->getPNR();
}
}
Неустранимая ошибка: объявление TraineeContainer :: add ($ element) должно быть
совместим с Container :: add (Employee $ element)
Есть ли способ установить в интерфейсе требуемый объект для пользовательского объекта?
Почему я этого хочу?
Многие IDE поддерживают эту форму описания экземпляров, предлагая методы, основанные на объекте.
Аргумент объекта Custome невозможен в интерфейсе, но вы можете достичь его другим способом.
создать общий базовый класс
class SomeBaseClass{
}
продлить свои занятия
class Employee extends SomeBaseClass{
}
class Trainee extends SomeBaseClass{
}
затем используйте SomeBaseClass
в качестве аргумента в вашем интерфейсе
interface Container {
public static function add(SomeBaseClass $element);
}
class EmployeeContainer implements Container {
public static function add(SomeBaseClass $element) {
$pnr = $element->getPNR();
}
}
class TraineeContainer implements Container {
public static function add(SomeBaseClass $element) {
$pnr = $element->getPNR();
}
}
Кажется у вас getPNR
общая функция, так что вы можете создать абстрактный класс или интерфейс и использовать его в своих дочерних классах.
К сожалению нет. Единственный способ — проверить тип аргумента внутри вашего метода:
public static function add($element) {
if(!$element instanceof \Trainee) {
throw new \InvalidArgumentException("your exception message");
}
$pnr = $element->getPNR();
}