从特质调用自己的方法

时间:2016-07-08 10:21:49

标签: php inheritance traits

我有一个扩展其他类并使用特征的类。

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类,但同样,从特征调用的方法应该调用自己的类方法。不是吗?

1 个答案:

答案 0 :(得分:3)

我从this answer获得了解决方案。

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

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

$this->traitConfigureOptions($resolver);