PHPDoc:总是产生自身或后代类的文档父类方法?

Bee*_*ice 5 php phpdoc phpstorm

考虑这个代码:

class ParentClass {

    public static function generate($className = __CLASS__){
        if(!$className) return new self();
        else return new $className();
    }
}

class ChildClass extends ParentClass {

    /**
     * @param string $className
     * @return ChildClass
     */
    public static function generate($className = __CLASS__) {
        return parent::generate($className);
    }
}

var_dump($ChildClass::generate()); // object(ChildClass)[1]
Run Code Online (Sandbox Code Playgroud)

ChildClass::generate()返回ChildClass我使用它的任何地方的实例,因为我从不提供$className参数。问题是我的 IDE 给了我一个关于parent::generate()调用与记录的返回类型不匹配的警告:

在此处输入图片说明

我想通过向父方法添加文档来消除此警告。我可以:

@return ParentClass | ChildClass
Run Code Online (Sandbox Code Playgroud)

将这个添加到父方法中是可行的,但这并不实用,因为有很多子类,而且将来可能会有更多。我已经尝试了以下两种方法:

@return static
@return $className
Run Code Online (Sandbox Code Playgroud)

但这并没有使警告消失。是否有 PHPDoc 批准的方法来指示调用子类将始终返回?或者——更准确地说——$className将返回一个类型的类?如果没有,有没有一种方法可以在我的 IDE 中工作?( PhpStorm 2017.2)

更新

@gogaz 下面的评论让我想到:如果 PHPDoc@return可以表明类似的东西就足够了self | descendants

Mac*_*ity 0

我遇到过类似的东西(PHPStorm 在这个主题上比 PHP 更肛门)。除非有某种原因你必须让它特定于子类,否则我会这样做

class ParentClass {
    /**
     * @param string $className
     * @return ParentClass
     */
    public static function generate($className = __CLASS__){
        if(!$className) return new self();
        else return new $className();
    }
}
Run Code Online (Sandbox Code Playgroud)

请记住,您的ChildClass仍然是一个实例ParentClass