从特征调用自己的方法
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);
我有一个 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);