[英]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.