从继承 class 中获取特征

Get trait from inherited class

我注意到一些我无法向自己解释的事情。我需要一点帮助来检查继承的 class 是否使用特定特征。为了更清楚一点,我使用以下代码。

trait Foo 
{
    public function say($what) 
    {
        echo $what;
        return $this;
    }
}

class A
{
    uses Foo;
}

class B extends A
{

}

我知道我应该使用 class_uses() 方法来查找 class 使用的所有特征。但这不适用于继承的实例。

$b = (new B())->say('hello');

上面的例子呼应了你好。所以trait继承成功,可以从class B.

使用
$used = class_uses($b);
var_dump($used);

令人惊讶的是,这会输出一个空数组。我预计 class_uses 会给我类似 Foo 的东西。但事实并非如此。

$reflection = new ReflectionClass('B');
$uses = $reflection->getTraits();
var_dump($uses);

同样的期望。但它只是输出一个空数组。

为什么在继承的class B中看不到class A中使用的特征?有没有其他方法可以解决这个问题?

class_uses — Return the traits used by the given class.

但是,您需要循环遍历继承树以使用所有特征,并遍历每个特征。

要获取所有特征,包括父 类 使用的特征和其他特征,请使用我从评论部分 php 文档页面获得的此函数 here:

function class_uses_deep($class, $autoload = true) { 
    $traits = []; 
    do { 
        $traits = array_merge(class_uses($class, $autoload), $traits); 
    } while($class = get_parent_class($class)); 
    foreach ($traits as $trait => $same) { 
        $traits = array_merge(class_uses($trait, $autoload), $traits); 
    } 
    return array_unique($traits); 
}