我遇到了一些我无法自行解决的问题。
我有类扩展 抽象类(在我的情况下,这些是几个控制器类和一个抽象类Controller
,使用过的框架赢了'在这里很重要,因为这是一个普通的PHP问题......)使用特征。我想覆盖其中一个特征中定义的方法。只有在我的子类中定义方法而不在我的抽象类中定义方法时,这才有效。
所以,这个完美无缺:
class MyController extends Controller
{
use AnyTrait;
public function anyMethodFromAnyTrait()
{
// override AnyTrait::anyMethodFromAnyTrait()
}
}
我也知道如何使用anyMethodFromAnyTrait
从AnyTrait
调用as
方法。
class MyController extends Controller
{
use AnyTrait { AnyTrait::anyMethodFromAnyTrait as method }
public function anyMethodFromAnyTrait()
{
// invoke AnyTrait::anyMethodFromAnyTrait()
$this->method();
}
}
两者都像魅力一样。
但我的问题有点不同。
当使用特征并在我的抽象类中定义方法时,我无法覆盖特征的方法。
假设以下控制器类:
class MyController extends Controller
{
public function anyAction()
{
// let's see what happens…
$this->anyMethodFromAnyTrait();
}
}
...以及由MyController
扩展的抽象内容:
abstract class Controller
{
use AnyTrait
public function anyMethodFromAnyTrait()
{
// do something different than AnyTrait
}
}
......这就是根本不工作的东西。每当我在$this->anyMethodFromAnyTrait()
内拨打MyController
时,都会调用AnyTrait
中实施的特征方法。我的抽象Controller
中的相同命名方法将被忽略。
因此,我只能在具体的子类中覆盖特征的方法,但不能覆盖由该子类扩展的抽象类。
因此,特征中的方法定义通过PHP获得的优先级高于抽象类中相同的方法定义。
您知道该行为的任何解决方法吗?
答案 0 :(得分:1)
一种解决方法是仅在子类中使用这些特征。 PHP总是更喜欢特征方法而不是本地"的。
它在子类中工作的原因是,超类的特征方法被扩展,而不是特征用法本身。