PHPStorm类型提示基类的子类

时间:2015-09-30 10:28:27

标签: php phpstorm phpdoc

关于这篇文章:

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

这是关于PHPStorm类型提示的边缘情况。 请尽量遵循 - 我会尽力做到尽可能清楚:

所以,我已经得到了这个基础抽象类:

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

另一个类继承自:

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

并由第三类进一步扩展:

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 myModel extends BaseModel {
    $world = 'world';
    public function form($my_variable) {
        do_something();
    }

我真正的问题是如何正确地对待" phpdoc"这种情况:

子类myNewController正在使用继承变量_model来分配另一个具有唯一函数myModel的类form的实例。 PHPStorm应如何在form中正确了解myNewController

到目前为止,我的解决方案涉及记录myBaseController这样:

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

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

也许我们可以这样做:

/**
 * @var BaseModel
 */

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

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

虽然这可能不是最好的做法,但这个肯定对你有用。

你可以"覆盖"子类中的_model成员,并将其作为BaseModel的子类记录。

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

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

答案 2 :(得分:-1)

要记录类方法的返回,请使用return $this; return static也有效