我注意到我无法向自己解释的某些事情。我需要一点帮助来检查是否继承的类使用了特定的特征。为了更清楚一点,我使用以下代码。
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类使用的特征?是否有解决此问题的替代方法?
答案 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);
}