は、我々は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::getEntity
とPseudoEntitySerializer::getEntity
がEntity
の任意のインスタンスを返すことが許可されていることを前提としています。結果として、RealEntitySerializer::getEntity
またはPseudoEntitySerializer::getEntity
respによって返されたオブジェクトの中間クラスの1つに固有のメソッドを呼び出すと、私のIDEは未定義のメソッドを呼び出すことを訴えています。
どうすれば両方の目標を達成できますか? (a)PHPによってエラーなしに解釈され、(b)適切に文書化されているコード。