从特征调用自己的方法

Call own method from trait

我有一个 class 扩展了另一个 class 并使用了一个特征。

class A extends ABase
{
    use MyTrait;
    //...
}

扩展的class(ABase)扩展了另一个class(ABase2),扩展了一个抽象的class(ABase3 ).

A class被创建时,trait构造函数被执行,因为A中没有定义构造函数。同时,trait 构造函数调用了一个方法(configureOptions),这个方法定义在 trait 中,也在抽象class ABase3 中具有相同的可见性(protected)。

trait MyTrait
{
    public function __construct($options)
    {
        //...
        $this->configureOptions($resolver);
       //... 
    }

    protected function configureOptions($resolver)
    {
        // Define options
    }
}

我不明白的是,从trait调用configureOptions时,执行的方法不是trait中定义的方法,而是抽象class中定义的方法( ABase3).

正如 PHP docs 所说:从基础 class 继承的成员被特征插入的成员覆盖。优先顺序是来自当前 class 的成员重写 Trait 方法,后者又重写继承的方法。

没有说从相同特征调用方法,但不应该先检查它自己的方法 class?

编辑:

不仅abstract class(ABase3)有configureOptions方法,还有Aclass方法,但是同样,从trait调用的方法应该调用自己的 class 方法。不是吗?

我从 this answer 那里得到了解决方案。

class A extends ABase
{
    use MyTrait {
        configureOptions as traitConfigureOptions;
    }
    //...
}

然后,而不是 parent::configureOptions($resolver)

$this->traitConfigureOptions($resolver);