从继承的类中获取特征

时间:2019-03-13 13:58:36

标签: php oop inheritance traits

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

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

class A
{
    uses Foo;
}

class B extends A
{

}

我知道我应该使用class_uses()方法来查找类使用的所有特征。但是,这对继承的实例不起作用。

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

上面的示例呼应。因此,该特征已成功继承,可以在B类中使用。

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

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

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

这里的期望值相同。但是它只是输出一个空数组。

为什么在继承的B类中看不到A类使用的特征?是否有解决此问题的替代方法?

1 个答案:

答案 0 :(得分:1)

  

class_uses —返回给定类使用的特征。

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

要获取所有特征,包括由父类使用的特征和其他特征,请使用我从注释部分here的php文档页面获得的此功能:

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); 
}