更正phpDoc告诉IDE动态类返回类型

时间:2017-09-08 13:12:39

标签: php phpdoc

考虑以下代码:

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实例:

enter image description here

有没有办法改进父的phpDoc块以更好地反映返回类型?

1 个答案:

答案 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。它仍然自动完成专门属于子类的方法和属性。