Взломать - как проверить, что экземпляр использует черту?
Как я могу проверить, использует ли экземпляр класса Trait? Я не могу использовать instanceof
потому что Черта неосуществима.
2 ответа
Hack - это супер-набор PHP (а также подмножество, учитывая, что некоторые устаревшие вещи были удалены), поэтому можно использовать большинство встроенных функций.
С учетом вышесказанного, у вас есть функция class_uses(), которая делает то, что вы хотите.
Вот упрощенный вариант использования:
if (in_array(\Foo\Bar::class, class_uses($object))) {
// Do something if $object is using \Foo\Bar trait
}
Вы можете использовать ReflectionObject с функциями getTraits или getTraitNames:
trait test {
public function hello()
{
echo "hello";
}
}
class A {
use test;
}
function hasTrait($object, $traitName)
{
$reflection = new ReflectionObject($object);
return in_array($traitName, $reflection->getTraitNames());
}
$a = new A();
if(hasTrait($a, 'test')) {
echo "Object of class 'A' has 'test' trait \n";
}