假设我有一个特征和一个类,它们各自具有相同名称的方法,但是类的方法是静态的,而特征的方法不是。是否可以定义一个既继承此类又使用该特征的类?
在代码中,它看起来像这样:
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