考慮下面的PHP接口:你可以用不同但「兼容」的簽名覆蓋接口方法嗎?
interface Item {
// some methods here
}
interface SuperItem extends Item {
// some extra methods here, not defined in Item
}
interface Collection {
public function add(Item $item);
// more methods here
}
interface SuperCollection extends Collection {
public function add(SuperItem $item);
// more methods here that "override" the Collection methods like "add()" does
}
我使用PHPStorm,我這樣做的時候,我得到的,基本上國在SuperCollection
add()
定義的IDE的錯誤是不與定義兼容它延伸的接口,Collection
。
以某種方式,我可以看到這是一個問題,因爲該方法的簽名不匹配它「覆蓋」的那個,正好是。不過,我確實認爲這是兼容的,因爲SuperItem
延伸了Item
,所以我會查看add(SuperItem)
與add(Item)
相同。
我很好奇這是否被PHP(版本5.4或更高版本)支持,也可能是IDE有一個錯誤,無法正確地捕捉到這個問題。
在5.3,我碰到一個「致命錯誤:SuperCollection聲明:: Add()方法必須與採集的兼容::加入( )」。所以它看起來像PhpStorm是正確的。你爲什麼認爲5.4可能會有不同的表現? – halfer 2013-02-21 20:37:06