Я заметил, что 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')){ ... }