Взломать - как проверить, что экземпляр использует черту?

Как я могу проверить, использует ли экземпляр класса 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";
}
Другие вопросы по тегам