假设我有一个特征和一个类,每个特征都有一个同名的方法,但是类的方法是静态的而特征的方法不是。是否可以定义一个既继承自该类又使用特征的类?
在代码中,这看起来像
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
我正在尝试做什么?如果是这样,怎么样?如果没有,请解释原因。谢谢!
修改
不幸的是,改变方法名称对我来说不是一个可行的选择,因为类和特性都被广泛地用于应用程序的其他部分。根据{{3}},特征的方法总是覆盖继承的方法。 (如果你将ParentClass::doStuff
更改为非静态的,你可以看到这一点,但这不是我可以做到的事情。)或许我所问的是它是否真的&#39 ; s可能使特征的方法不覆盖继承的静态方法(这似乎是正常的行为)?
我还创建了第二个特征,将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
答案 0 :(得分:0)
这可能是一种误解。静态方法和非静态方法不应该做同样的工作,所以应该有不同的名称,也许你的名字不够明确。
您无法执行此操作,因为在创建别名时,旧名称和新名称都存在。所以作为" doStuff"仍然存在,它与ParentClass产生冲突。
见这个例子:
trait MyTrait
{
public function doStuff()
{
return 'foo';
}
}
class Foo
{
use MyTrait {
doStuff as doOtherStuff;
}
}
echo Foo::doStuff(); // doStuff still works