我有一个扩展其他类并使用特征的类。
class A extends ABase
{
use MyTrait;
//...
}
扩展类(ABase
)扩展了另一个类(ABase2
),它扩展了一个抽象类(ABase3
)。
当创建A
类时,执行特征构造函数,因为A
中没有定义构造函数。同时,trait构造函数调用一个方法(configureOptions
),该方法在特征中定义,但也在抽象类ABase3
中调用,具有相同的可见性(受保护)。
trait MyTrait
{
public function __construct($options)
{
//...
$this->configureOptions($resolver);
//...
}
protected function configureOptions($resolver)
{
// Define options
}
}
我不明白的是,当从特征调用configureOptions
时,执行的方法不是特征中定义的方法,而是抽象类中定义的方法({{1} })。
正如PHP docs所说:来自基类的继承成员被特征插入的成员覆盖。优先顺序是当前类的成员覆盖Trait方法,后者又覆盖继承的方法。
对于从同一特征调用方法没有任何说法,但是不应该首先检查自己类中的方法吗?
修改
不仅抽象类(ABase3
)具有ABase3
方法,而且还有A类,但同样,从特征调用的方法应该调用自己的类方法。不是吗?
答案 0 :(得分:3)
我从this answer获得了解决方案。
class A extends ABase
{
use MyTrait {
configureOptions as traitConfigureOptions;
}
//...
}
然后,而不是parent::configureOptions($resolver)
:
$this->traitConfigureOptions($resolver);