通过PHPdoc缩小抽象方法继承时的返回类型会导致PHP错误

通过PHPdoc缩小抽象方法继承时的返回类型会导致PHP错误,php,inheritance,phpdoc,type-narrowing,Php,Inheritance,Phpdoc,Type Narrowing,假设我们在PHP中有以下继承链 抽象类实体{} 抽象类RealEntity扩展了实体{} 抽象类伪实体扩展实体{} 还有一堆其他类,它们反映了相同的继承链 抽象类EntitySerializer{ /** *@返回实体 */ 抽象公共函数getEntity(); } 抽象类RealEntitySerializer扩展了EntitySerializer{ /** *@returnrealtentity */ 抽象公共函数getEntity(); } 抽象类PseudoEntitySerializ

假设我们在PHP中有以下继承链

抽象类实体{}
抽象类RealEntity扩展了实体{}
抽象类伪实体扩展实体{}
还有一堆其他类,它们反映了相同的继承链

抽象类EntitySerializer{
/**
*@返回实体
*/
抽象公共函数getEntity();
}
抽象类RealEntitySerializer扩展了EntitySerializer{
/**
*@returnrealtentity
*/
抽象公共函数getEntity();
}
抽象类PseudoEntitySerializer扩展了EntitySerializer{
/**
*@return伪实体
*/
抽象公共函数getEntity();
}
PHP抱怨抽象方法
getEntity
必须正确实现(并松开
abstract
关键字),或者不能重新声明。我可以理解为什么PHP会抱怨,因为尽管有PHPdoc注释,方法签名还是与
EntitySerializer
中父方法的签名相同

但是,我想以某种方式明确指出,扩展
realetityserializer
PseudoEntitySerializer
的子类不能返回任意
实体的实例,而应将返回类型缩小为
realetentity
PseudoEntity

特别是,如果为了让PHP开心,我省略了中间类中对方法及其对应PHPdoc的重新定义,那么我的IDE正确地假设
realetityserializer::getEntity
PseudoEntitySerializer::getEntity
可以返回
Entity
的任意实例。因此,我的IDE抱怨说,如果我调用对象上某个中间类的特定方法,而该对象是由
RealEntitySerializer::getEntity
PseudoEntitySerializer::getEntity
返回的,那么我会调用未定义的方法

如何实现这两个目标?(a)由PHP解释且无错误且(b)记录正确的代码。

您需要@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 {}