【问题标题】:Correct phpDoc to tell IDE of dynamic class return type正确的 phpDoc 告诉 IDE 动态类返回类型
【发布时间】:2017-09-08 13:12:39
【问题描述】:

考虑这段代码:

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 块以更好地反映返回类型?

【问题讨论】:

    标签: php phpdoc


    【解决方案1】:

    我想通了,将这个 phpDoc 块用于ParentClass::getNew()

    /** @return static */
    public function getNew(){/*...*/}
    

    phpDoc Types keywords

    self - 使用此类型的类的对象,如果继承它仍将代表最初定义它的类。

    static - 使用此值的类的对象,如果继承,它将代表子类。 (参见 PHP 手册中的后期静态绑定)。

    $this - 这个确切的对象实例,通常用于表示流畅的接口。

    PhpStorm 2017.2 理解它,并认识到$child->getNew() 将返回一个子实例。 IDE 并不完全称它为ChildClass,而是称它为static。它仍然会自动完成仅属于子类的方法和属性。

    【讨论】:

    • @Erik 它可能有效(为 IDE 提供正确的输入信息),但我认为这在技术上不准确,因为我返回的是一个新实例,而不是现有的 $this 参考。
    • 正确。在评论之前没有仔细看你的代码:)
    猜你喜欢
    • 2018-08-16
    • 2018-04-06
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    相关资源
    最近更新 更多