[英]How do you use a trait with a non-static method that conflicts with an inherited static method?
说我有一个特征和一个类,每个特征和一个类都有一个具有相同名称的方法,但是该类的方法是静态的,而特征的方法则不是。 是否可以定义一个既继承自该类又使用该特征的类?
在代码中,这看起来像
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
我想做的事可能吗? 如果是这样,怎么办? 如果没有,请解释为什么不这样做。 谢谢!
编辑
不幸的是,更改方法名称对我来说不是一个可行的选择,因为类和特征都在应用程序的其他部分广泛使用。 根据PHP文档 ,特征的方法始终会覆盖继承的方法。 (如果您将ParentClass::doStuff
更改为非静态,则可以在工作中看到这一点,但这也不是我可以做的。)也许我要问的是,是否真的有可能使trait的方法不覆盖继承静态方法(这似乎是正常行为)?
我还创建别名第二个特征MyTrait::doStuff
到doOtherStuff
和使用代替。
trait MyTrait2
{
use MyTrait {
doStuff as doOtherStuff;
}
}
class ChildClass extends ParentClass
{
use MyTrait2;
}
但这会产生相同的错误,我觉得很奇怪。
Cannot make static method ParentClass::doStuff() non static in class MyTrait2
这可能是一个误解。 静态方法和非静态方法不应执行相同的工作,因此应使用不同的名称,也许您的名称不够明确。
您不能这样做,因为在创建别名时,旧名称和新名称都存在。 因此,由于“ doStuff”仍然存在,因此与ParentClass产生了冲突。
请参阅以下示例:
trait MyTrait
{
public function doStuff()
{
return 'foo';
}
}
class Foo
{
use MyTrait {
doStuff as doOtherStuff;
}
}
echo Foo::doStuff(); // doStuff still works
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.