【问题标题】:PhpStorm: annotation for inherited method return type?PhpStorm:继承方法返回类型的注释?
【发布时间】:2014-01-26 08:17:15
【问题描述】:

使用 Behat 子上下文类,我需要从主上下文调用一个方法,例如$this->getMainContext()->fooBar()。 PhpStorm 相当合理地警告我 fooBar() 不存在,因为它希望 getMainContext() 返回一个 ExtendedContextInterface,而不是我的具体 FeatureContext

有没有办法注释我的子类来告诉 PhpStorm getMainContext() 实际上返回了我的具体类?

一种解决方案是重写 getMainContext() 只是为了有一个方法来添加我自己的 PHPDoc,从而指定不同的返回类型,但是添加一个方法只是为了在 IDE 中获得更好的代码感觉是可怕的。

顺便说一句,我知道这有点老套,理论上我的子上下文不应该依赖于具有特定具体实现的主要上下文;实际上,尽管 Behat 并没有做到这一点。

【问题讨论】:

    标签: annotations phpstorm intellisense


    【解决方案1】:

    使用标准的@method 注解进行类工作:

     /**
      * @method FeatureContext getMainContext()
      */
     class SubContext extends BehatContext
     {
         public function foo()
         {
              $this->getMainContext()->bar();
         }
     }
    

    【讨论】:

    • 如果有人在这里需要它是规范manual.phpdoc.org/HTMLSmartyConverter/PHP/phpDocumentor/…
    • 我几乎有同样的问题,除了不是方法而是类变量,但我认为没有解决方案。我的类(本身从基类派生)为基类成员分配一个类型,该类型是基类中定义的类型的子类,我不知道如何告诉 IDE。
    • @AndyClaw 你肯定不需要吗?如果您分配的对象扩展了基类指定的类型,那么它的公共 API 应该与该基类型的相同,不是吗?
    • 找到解决方案!您可以在类定义上方使用“魔术属性”。看起来像“@property”。 @RichardTurner 子类通常具有未在父类中定义的新功能。子类更多的是对基础的扩展,而不仅仅是实现。
    猜你喜欢
    • 2020-11-20
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多