基类的PHPStorm类型暗示子类

基类的PHPStorm类型暗示子类,php,phpstorm,phpdoc,Php,Phpstorm,Phpdoc,关于这个职位: , 这是关于PHPStorm类型暗示中的一个边缘情况。 请试着跟着我-我会尽我所能做到尽可能清楚: 我有一个基本的抽象类: abstract class myBaseController { protected $_model; ... } 另一个类继承自哪个类: class myController extends myBaseController { $hello = 'hello'; ... } 并进一步扩展为第三级: class myN

关于这个职位:

,

这是关于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
正在使用继承变量
\u model
来分配另一个类
myModel
的实例,该类具有唯一的函数
表单
。PHPStorm应该如何在
myNewController
中正确查找
form

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

abstract class myBaseController {
    /**
     * @var object
     */
     protected $_model;
    ...
}
然而,我认为
@var object
太宽泛了(PHPStorm找不到它的声明),我猜想应该有更好(更具体)的方法来实现这一点

也许我们可以改为:

/**
 * @var BaseModel
 */
如果PHPStorm有一种方法可以查看该方法的子类

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

要记录类方法的返回,请使用
return$this
<代码>返回静态也有效

虽然可能不是最佳实践,但这一方法肯定适用于您

您可以“覆盖”子类中的
\u 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

试试:`/***@var$variableName ClassName*/`@lolka\u bolka如果我这样做,它会工作,但是
$\u model
会锁定到
ClassName
<代码>$\u模型可以自由分配给我的任何模型类,每个模型类都可能有唯一的方法。因此,理想情况下,我应该从子类
myNewController
中记录
$\u model
。请您对下一票进行评论好吗?如果您想要继承类返回不同类型对象的功能,您可以强制执行getter方法,而不是直接访问成员
$\u model
。基本上,您坚持使用
抽象公共函数getModel()在抽象类中。扩展它的每个类都实现该方法并返回特定类型的模型。您可以在扩展类中输入返回的对象类型。我认为这是唯一的方法,我不知道PHPStorm如何能够找出你所考虑的对象类型。@N.B.对。好啊虽然不需要走一圈,但效果很好。我想PHPStom可以通过查看
BaseModel
的所有子类来计算出函数。。。如果我不使用
@var object
而使用
@var BaseModel
…谢谢!成功了!很高兴知道。我不知道这个
@属性
注释。它确实有效,如果它没有引入任何新的代码/重组,我会接受你的答案。很高兴知道,没关系。这是我迄今为止最好的想法,但@fschmengler的答案确实要好得多。生活和学习!;)