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