考虑以下代码:
class ParentClass {
/** @return ParentClass */
public function getNew(){
return call_user_func(array($this,'generator'));
}
protected function generator(){
return new static(); // will actually return whatever class calls this code
}
}
class ChildClass extends ParentClass {}
$child = new ChildClass();
var_dump($child->getnew()); // object(ChildClass)
由于ParentClass::generator()
返回static()
,当子实例调用getNew()
时,会返回ChildClass()
。 IDE(我的案例中为PhpStorm)无法解决此问题,因为生成器是使用call_user_func()
动态调用的。因此,IDE认为将返回ParentClass
实例:
有没有办法改进父的phpDoc块以更好地反映返回类型?
答案 0 :(得分:2)
我想出来了,使用这个phpDoc块来ParentClass::getNew()
:
/** @return static */
public function getNew(){/*...*/}
phpDoc Types keywords
self - 使用此类型的类的对象,如果继承,它仍将代表最初定义它的类。
static - 消耗此值的类的对象,如果继承,则表示子类。 (请参阅PHP手册中的后期静态绑定)。
$ this - 这个确切的对象实例,通常用于表示流畅的界面。
PhpStorm 2017.2理解它,并认识到$child->getNew()
将返回子实例。 IDE并没有把它称为ChildClass
,而是static
。它仍然自动完成专门属于子类的方法和属性。