2016-09-02 9 views
1

は、我々はPHP細め戻り値の型は

abstract class Entity {} 
abstract class RealEntity extends Entity {} 
abstract class PseudoEntity extends Entity {} 

で、次の継承チェーンと同じ継承チェーンをミラーリングする他のクラスの束を持っていると仮定PHPエラーが発生し

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::getEntityPseudoEntitySerializer::getEntityEntityの任意のインスタンスを返すことが許可されていることを前提としています。結果として、RealEntitySerializer::getEntityまたはPseudoEntitySerializer::getEntity respによって返されたオブジェクトの中間クラスの1つに固有のメソッドを呼び出すと、私のIDEは未定義のメソッドを呼び出すことを訴えています。

どうすれば両方の目標を達成できますか? (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 {}