PHP instanceof for traits

2019-02-04 12:09发布

What is the proper way to check if a class uses a certain trait?

3条回答
一纸荒年 Trace。
2楼-- · 2019-02-04 12:19

It's not really clean and may not be the right solution for your case. But an alternative is to check if the object or class implements a method of the Trait (as usually you don't overwrite existing methods with Trait)

if (method_exists($my_object, 'MyTraitSpecificMethod')){
    ...
}
查看更多
仙女界的扛把子
3楼-- · 2019-02-04 12:22

You can use class_uses function to get an array of all the traits used by a class.

Then you check if this array has a key with the same name of the trait you're testing for.

if so, then your class is using your trait. If not, then it's not using it.

查看更多
我想做一个坏孩纸
4楼-- · 2019-02-04 12:42

While nothing stops you from using instanceof with traits, the recommended approach is to pair traits with interfaces. So you'd have:

class Foo implements MyInterface
{
    use MyTrait;
}

Where MyTrait is an implementation of MyInterface. Then you check for the interface instead of traits like so:

if ($foo instanceof MyInterface) {
    ...
}

And you can also type hint, which you can't with traits:

function bar(MyInterface $foo) {
    ...
}

In case you absolutely need to know whether a class is using a certain trait or implementation, you can just add another method to the interface, which returns a different value based on the implementation.

查看更多
登录 后发表回答