PHPDoc:记录始终产生自身或后代类的父类方法?

标签 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 | 的东西就足够了后代

最佳答案

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

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);
    }
}

希望这能解决您的问题。

更新: 另一种方法是使用所有类都将实现的接口(interface),因此您可以期望生成方法将返回某个实现该接口(interface)的类。

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

如果这不能解决您的问题...那么,您可以将返回类型设置为“混合”,这将抑制警告并且不会说谎 :) 因为您的生成方法可以返回您通过参数指定的任何类...

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

关于PHPDoc:记录始终产生自身或后代类的父类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300393/

相关文章:

PHP UNIX 时间戳不迭代到相同的值

php - 如何处理神奇实现方法的 "method not found in class"警告?

php - 记录文件、类和构造函数的正确方法是什么?

mysql查询中的php变量

php - 使用 PHP、MySQL 和 SQLite 登录和注册

linux - JetBrains 产品 2016 出现错误

php - eclipse PDT 中的错误 phpdoc 错误

phpDocumentor 制表符分隔符

php - 如何在 Laravel 5.4 中存储数组 cookie?

html - 在 PHPStorm 中使用正则表达式替换 SRC 和 HREF 属性