簡體   English   中英

如何將特征與與繼承的靜態方法沖突的非靜態方法一起使用?

[英]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::doStuffdoOtherStuff和使用代替。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM