класс — PHP instanceof для черт

Как правильно проверить, использует ли класс определенную черту?

15

Решение

Пока ничто не мешает вам использовать instanceof с признаками рекомендуемый подход состоит в соединении признаков с интерфейсами. Итак, у вас будет:

class Foo implements MyInterface
{
use MyTrait;
}

куда MyTrait это реализация MyInterface,
Затем вы проверяете интерфейс вместо черт, например:

if ($foo instanceof MyInterface) {
...
}

И вы также можете ввести подсказку, чего нельзя сделать с чертами:

function bar(MyInterface $foo) {
...
}

В случае, если вам абсолютно необходимо знать, использует ли класс определенную черту или реализацию, вы можете просто добавить в интерфейс другой метод, который возвращает другое значение в зависимости от реализации.

30

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

Ты можешь использовать class_uses функция, чтобы получить массив всех признаков, используемых классом.

Затем вы проверяете, есть ли в этом массиве ключ с тем же именем черты, которую вы проверяете.

если так, то ваш класс использует вашу черту.
Если нет, то он не использует его.

25

Это не совсем чисто и не может быть правильным решением для вашего случая. Но альтернативой является проверка того, реализует ли объект или класс метод Trait (как правило, вы не перезаписываете существующие методы с Trait)

if (method_exists($my_object, 'MyTraitSpecificMethod')){
...
}
5
По вопросам рекламы [email protected]