Как правильно проверить, использует ли класс определенную черту?
Пока ничто не мешает вам использовать instanceof
с признаками рекомендуемый подход состоит в соединении признаков с интерфейсами. Итак, у вас будет:
class Foo implements MyInterface
{
use MyTrait;
}
куда MyTrait
это реализация MyInterface
,
Затем вы проверяете интерфейс вместо черт, например:
if ($foo instanceof MyInterface) {
...
}
И вы также можете ввести подсказку, чего нельзя сделать с чертами:
function bar(MyInterface $foo) {
...
}
В случае, если вам абсолютно необходимо знать, использует ли класс определенную черту или реализацию, вы можете просто добавить в интерфейс другой метод, который возвращает другое значение в зависимости от реализации.
Ты можешь использовать class_uses
функция, чтобы получить массив всех признаков, используемых классом.
Затем вы проверяете, есть ли в этом массиве ключ с тем же именем черты, которую вы проверяете.
если так, то ваш класс использует вашу черту.
Если нет, то он не использует его.
Это не совсем чисто и не может быть правильным решением для вашего случая. Но альтернативой является проверка того, реализует ли объект или класс метод Trait (как правило, вы не перезаписываете существующие методы с Trait)
if (method_exists($my_object, 'MyTraitSpecificMethod')){
...
}