2016-09-02 27 views
1

假設我們有在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中父方法的簽名完全相同。

不過,我想以某種方式做出明確規定擴展RealEntitySerializerPseudoEntitySerializer不能返回任意Entity的實例,但縮小返回類型RealEntityPseudoEntity RESP子類。

特別是,如果我省略了方法的重新定義,並從中間階級爲了讓PHP幸福其相應的PHPDoc的,我的IDE正確假定RealEntitySerializer::getEntityPseudoEntitySerializer::getEntity被允許返回的Entity任意實例。結果,我的IDE抱怨說,如果我調用方法,這些方法對於由RealEntitySerializer::getEntityPseudoEntitySerializer::getEntityPseudoEntitySerializer::getEntityPseudoEntitySerializer::getEntity返回的對象中的某個中間類特定。

如何實現兩個目標? (a)由PHP解釋而沒有錯誤,並且(b)正確記錄的代碼。

回答

0

您想要PSR-5: PHPDoc@method標記。

語法
@method [return type] [name]([type] [parameter], [...]) [description] 

實例
/** 
* @method string getString() 
* @method void setInteger(int $integer) 
* @method setString(int $integer) 
*/ 
class Child extends Parent 
{ 
    <...> 
} 


abstract class EntitySerializer { 
    /** 
    * @return Entity 
    */ 
    abstract public function getEntity(); 
} 

/** 
* @method RealEntity getEntity() 
*/ 
abstract class RealEntitySerializer extends EntitySerializer {} 

/** 
* @method PseudoEntity getEntity() 
*/ 
abstract class PseudoEntitySerializer extends EntitySerializer {}