PHPStorm 类型提示基类的子类

PHPStorm type hinting subclasses of baseclass

关于这个post:

In PHPStorm, how can I make type hinting work when I have a superclass method that returns a different type from each subclass,

这是关于 PHPStorm 类型提示中的一个边缘案例。 请尝试跟进 - 我会尽我所能尽可能清楚:

所以,我得到了这个基础摘要 class:

abstract class myBaseController {
    protected $_model;
    ...
}

另一个 class 继承自:

class myController extends myBaseController {
    $hello = 'hello';
    ...
}

并且进一步扩展了三分之一 class:

class myNewController extends myController {
    public $myvar;
    $this->_model = new myModel();
    ...

    public function myFunc(){
        // !!form is underlined as: "Method 'form' not found in class"!!
        $form = $this->_model->form($new_variable); 
    }

下面是 myModel 的示例 class:

class myModel extends BaseModel {
    $world = 'world';
    public function form($my_variable) {
        do_something();
    }

我真正的问题是如何正确"phpdoc"这个场景:

A subclass myNewController 正在使用继承变量 _model 分配另一个 class myModel 的实例一个独特的功能 form。 PHPStorm 应该如何正确地找到 myNewController 中的 form?

到目前为止,我的解决方案包括像这样记录 myBaseController

abstract class myBaseController {
    /**
     * @var object
     */
     protected $_model;
    ...
}

但是我认为 @var object 过于宽泛(PHPStorm 找不到它的声明),我的猜测是应该有更好(更具体)的方法来做到这一点。

也许我们可以改为:

/**
 * @var BaseModel
 */

如果 PHPStorm 有办法查看该方法的子classes。

有什么想法吗? 提前谢谢大家。

要记录 class 方法的 return,请使用 return $thisreturn static 也有效

虽然这可能不是最佳做法,但它肯定适合您。

您可以 "override" 子类中的 _model 成员并将其记录为 BaseModel 的子类。

// superclass
abstract class myBaseController {
    /**
     * @var BaseModel
     */
     protected $_model;
    ...
}

// subclass
class myNewController extends myBaseController {
    /**
     * @var MyDerivedModel
     */
    protected $_model;
    ...
}

您可以在子类中指定 属性 类型,而无需引入新代码,使用 @property 注释:

/**
 * @property myModel $_model
 */
class myNewController extends myController