2017-05-09 45 views
0

我有兩個較老的extbase擴展A和B.Exe B擴展了A的Person模型和控制器並覆蓋了showAction。擴展模型被命名爲「Personcc」,而原始模型被命名爲「Person」。該showAction看起來像用PHP7中的不同聲明覆蓋方法

//show action in Controller of EXT A 
public function showAction(Vendor\Ext\Domain\Model\Person = $person) { 
    ... 
} 

//show action of extending controller:  
public function showAction(Vendor\Ext\Domain\Model\Personcc = $person) { 
    ... 
} 

現在我必須更新擴展名,讓他們與PHP7工作。在PHP5中,它是這樣工作的,但不在PHP 7中。錯誤是,聲明「應該兼容」。 除了完全重建Ext B之外,我還能做些什麼?有沒有辦法說PHP7:「請接受這個」?

(示例代碼是有點抽象,但問題應該是明確的,它經歷了整個擴展。如果沒有一個好主意克服這一點,我想擴展需要被完全重新設計。)

+2

參見:http://stackoverflow.com/questions/36079651/silence-declaration-should-be-compatible-warnings-in-php-7 –

回答

0

你打破了Liskov Substitution Principle。在面向對象的設計方面,這是非常糟糕的。簡而言之,如果你有一個對象,那麼在你使用該對象的任何地方,你都可以使用該對象的一個​​子類。

它是intended to guarantee semantic interoperability。換句話說,它的目的是節省您的時間,同時也是您的程序員時間,花時間去了解您的程序。不僅你的程序員,還有像靜態分析器這樣的工具,通過防止罕見的錯誤來讓你的生活更輕鬆。

如果你認爲你的代碼只能處理一個普通對象的某個子類型,那麼這是一個不屬於該函數簽名的約束。將它移到該函數的主體,無論是斷言還是異常,然後繼續前進。