假設我們有在PHP窄化返回類型導致PHP錯誤
abstract class Entity {}
abstract class RealEntity extends Entity {}
abstract class PseudoEntity extends Entity {}
以下繼承鏈和一堆該鏡像相同繼承鏈的其他類的
abstract class EntitySerializer {
/**
* @return Entity
*/
abstract public function getEntity();
}
abstract class RealEntitySerializer extends EntitySerializer {
/**
* @return RealEntity
*/
abstract public function getEntity();
}
abstract class PseudoEntitySerializer extends EntitySerializer {
/**
* @return PseudoEntity
*/
abstract public function getEntity();
}
PHP抱怨抽象方法getEntity
必須正確實現(並且丟棄關鍵字abstract
)或不得重新聲明。我可以理解爲什麼PHP會抱怨,因爲儘管有PHPdoc註釋,但方法簽名與EntitySerializer
中父方法的簽名完全相同。
不過,我想以某種方式做出明確規定擴展RealEntitySerializer
或PseudoEntitySerializer
不能返回任意Entity
的實例,但縮小返回類型RealEntity
或PseudoEntity
RESP子類。
特別是,如果我省略了方法的重新定義,並從中間階級爲了讓PHP幸福其相應的PHPDoc的,我的IDE正確假定RealEntitySerializer::getEntity
和PseudoEntitySerializer::getEntity
被允許返回的Entity
任意實例。結果,我的IDE抱怨說,如果我調用方法,這些方法對於由RealEntitySerializer::getEntity
或PseudoEntitySerializer::getEntity
或PseudoEntitySerializer::getEntity
或PseudoEntitySerializer::getEntity
返回的對象中的某個中間類特定。
如何實現兩個目標? (a)由PHP解釋而沒有錯誤,並且(b)正確記錄的代碼。