从继承 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);
}
我注意到一些我无法向自己解释的事情。我需要一点帮助来检查继承的 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);
}