如何在具有与继承的静态方法冲突的非��态方法的特质中使用该特质?

3

假设我有一个特征和一个类,它们各自具有相同名称的方法,但是类的方法是静态的,而特征的方法不是。是否可以定义一个既继承此类又使用该特征的类?

在代码中,它看起来像这样:

trait MyTrait
{
    public function doStuff()
    {
        return 'trait';
    }
}

class ParentClass
{
    public static function doStuff()
    {
        return 'parent';
    }
}

class ChildClass extends ParentClass // I'm feeling really original today apparently
{
    use MyTrait;
}

我的第一个想法是在特质上别名化方法,如下:

class ChildClass extends ParentClass
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

但是似乎该特性仍然试图覆盖父类中的方法,因此会引发错误。
Cannot make static method ParentClass::doStuff() non static in class MyTrait

我尝试的事情是否可行?如果可以,如何操作?如果不行,请解释原因。谢谢!
编辑
很遗憾,更改方法名称对我来说不是一种可行的选择,因为在应用程序的其他部分广泛使用了类和trait。根据PHP文档的说明,trait的方法始终会覆盖继承的方法。(如果您将ParentClass :: doStuff更改为非静态方法,则可以看到这一点,但我也无法实现这一点。)也许我的问题实际上是是否可能使trait的方法不覆盖继承的静态方法(这似乎是正常行为)?
我还创建了第二个trait,它将“ MyTrait :: doStuff”别名为“ doOtherStuff”,并使用该trait。
trait MyTrait2
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

class ChildClass extends ParentClass
{
    use MyTrait2;
}

但是这个操作会出现相同的错误,我觉得很奇怪。
Cannot make static method ParentClass::doStuff() non static in class MyTrait2
1个回答

0
这可能是一个误解。静态方法和非静态方法不应该做同样的工作,因此应该有不同的名称,也许你的名称不够明确。
你不能这么做,因为当你创建别名时,旧名称和新名称都存在。因此,“doStuff”仍然存在,它与ParentClass产生冲突。
请看下面的例子:
trait MyTrait
{
    public function doStuff()
    {
        return 'foo';
    }
}

class Foo
{
    use MyTrait {
        doStuff as doOtherStuff;
    }
}

echo Foo::doStuff(); // doStuff still works

没问题。我同意你的想法,并发现如果类的方法是非静态的,trait 会覆盖它。但更改方法名称对我来说不是可行的选择。因为我正在使用的应用程序中广泛使用了父类和 trait,所以更改任何一个都将是一项痛苦的工作。 - Sean the Bean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接