如何在抽象类中覆盖特征的方法?

时间:2015-08-03 12:06:38

标签: php abstract-class traits

我遇到了一些我无法自行解决的问题。

我有类扩展 抽象类(在我的情况下,这些是几个控制器类和一个抽象类Controller,使用过的框架赢了'在这里很重要,因为这是一个普通的PHP问题......)使用特征。我想覆盖其中一个特征中定义的方法。只有在我的子类中定义方法而不在我的抽象类中定义方法时,这才有效。

所以,这个完美无缺:

class MyController extends Controller
{
    use AnyTrait;

    public function anyMethodFromAnyTrait()
    {
        // override AnyTrait::anyMethodFromAnyTrait()
    }
}

我也知道如何使用anyMethodFromAnyTraitAnyTrait调用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获得的优先级高于抽象类中相同的方法定义。

您知道该行为的任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

一种解决方法是仅在子类中使用这些特征。 PHP总是更喜欢特征方法而不是本地"的。

它在子类中工作的原因是,超类的特征方法被扩展,而不是特征用法本身。