PHP instanceof для черт

Я заметил, что instanceof работает с чертами тоже. Является ли это правильным способом проверить, использует ли класс определенный признак или есть ли какой-либо другой метод?

Хотя ничто не мешает вам использовать 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')){ ... }