Создать интерфейсную функцию с пользовательским объектом

Есть ли возможность создать интерфейсную функцию в 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 поддерживают эту форму описания экземпляров, предлагая методы, основанные на объекте.

2

Решение

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

1

Другие решения

К сожалению нет. Единственный способ — проверить тип аргумента внутри вашего метода:

public static function add($element) {
if(!$element instanceof \Trainee) {
throw new \InvalidArgumentException("your exception message");
}

$pnr = $element->getPNR();
}
2

По вопросам рекламы [email protected]