【问题标题】:Get trait from inherited class [duplicate]从继承的类中获取特征[重复]
【发布时间】:2019-03-13 13:58:36
【问题描述】:

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

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

上面的例子呼应了你好。所以 trait 继承成功,可以从 B 类中使用。

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

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

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

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

为什么在继承的类 B 中看不到来自类 A 的 used trait?有没有办法解决这个问题?

【问题讨论】:

  • 对于这两种方法,页面上都有 cmets,它们不显示父类的特征。
  • 还有更多 - 在class_uses 的 cmets 部分,有一个解决方案可以获取所有特征。但是谁读 cmets。
  • 好吧,现在有点尴尬。感谢您的提示。我想我在这里有点失明。

标签: php oop inheritance traits


【解决方案1】:

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

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

要获取所有特征,包括父类和其他特征使用的特征,请使用我从 cmets 部分的 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); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多