2012-07-17 29 views
11

我不知道是否有任何好的理由,爲什麼這種行爲可能在當前的PHP 5.4的實現:PHP 5.4:爲什麼類可以用不同的簽名覆蓋特徵方法?

trait T { 
    public function test(PDO $pdo) {} 
} 

class C { 
    use T; 
    public function test(DOMDocument $dom) {} 
} 

我認爲這是一類使用特性,保證這個類有一個具體的事實界面可用。但在這裏,如果我們無意中爲了另一個目的而忽略特質方法,我們甚至沒有像經典繼承那樣收到嚴格標準通知。

這是特意允許的嗎?做什麼的?

回答

26

此行爲已記錄。從php.net(http://php.net/manual/en/language.oop5.traits.php):

的繼承從基類構件通過由特質插入的構件 覆蓋。優先順序是來自 當前類的成員重寫Trait方法,該方法在返回時覆蓋 繼承的方法。

沒有理由在這裏通知。

編輯:

我花了一些比較嚴重的文學一看就闡明這一主題:)一些輕。看起來這種行爲是特質定義的一部分。他們正在以這種方式工作。這是從研究「特徵:行爲的可組合的單元」(面向對象程序設計歐洲會議論文集):

特質組成的另一個特性是組成順序是 無關,因此相互衝突的特質方法必須明確地 消歧(參見3.5節)。在 定義的方法之間的衝突由納入的特徵定義的類和方法使用以下兩個優先規則來解決: 。

- 類方法優先於特徵方法。

- 特徵方法優先於超類方法。這來自於穩定屬性,它表明特徵方法的行爲就好像它們在類中定義一樣。

你可以在這裏閱讀更多:http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf

+0

謝謝您的回答,它確實說的類可以覆蓋特徵的方法,但並沒有說爲什麼可以用不同的簽名重寫它! – Benjamin 2012-07-17 16:16:28

+0

我更新了我的帖子。 – Eugene 2012-07-18 14:55:08

+0

據我所知,PHP中的特徵覆蓋方法與繼承的方式相同,即沒有簽名檢查,只有方法名稱。 – Timur 2012-07-18 15:00:59

相關問題