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

时间:2017-09-19 12:24:18

标签: php phpstorm phpdoc

考虑以下代码:

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]

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

enter image description here

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

@return ParentClass | ChildClass

将这个添加到父方法有效,但这不实用,因为有十几个子类,将来可能会有更多。我尝试了以下两种方法:

@return static
@return $className

但这并未使警告消失。是否有PHPDoc批准的方式来表明将始终返回调用子类?或者 - 更准确地说 - 将返回类$className类?如果没有,有没有办法即使只用我的IDE? (PhpStorm 2017.2

更新

下面的@gogaz评论让我思考:如果PHPDoc @return可能表示类似self | descendants

这样就足够了

2 个答案:

答案 0 :(得分: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();
    }
}

请注意,您的ChildClass仍然是ParentClass

的实例

答案 1 :(得分:0)

您可以记录父类方法,然后在子类方法上继承它。

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

class ChildClass extends ParentClass
{
    /**
     * @inheritdoc
     */
    public static function generate($className = __CLASS__) {
        return parent::generate($className);
    }
}

我希望这能解决你的问题。

<强> 更新 : 另一种方法是使用所有类将实现的接口,因此您可以期望您的generate方法将返回一些实现该接口的类。

 /**
  * ...
  * @return MyCustomInterface
  */

如果这不能解决您的问题...那么,您可以将返回类型设置为&#34;混合&#34;,这将禁止警告,它不会说谎:)因为您的生成method可以返回你通过参数指定的任何类......

 /**
  * ...
  * @return mixed
  */