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