如何处理魔法实现方法中的“类中找不到的方法”警告?
我坐在一个大型的代码库上,这个代码库包含了几个通过魔法实现的方法公开function的类(使用__call
和__callStatic
)。 例如:
class Foo { public function __call($name, $parameters) { echo "You called $name().\n"; } } $f = new Foo; $f->test(); // runs fine, but PhpStorm flags as a warning
问题是PhpStorm认为test()
方法不存在,所以它在呼叫站点发出警告。 这有点烦人,因为代码当然会按预期运行。
我已经通过检查“如果在类中存在__magic方法的降级严重性”来调整严重性,但是我更愿意:
- 完全禁用此function只为特定的类,或
- 使用IDE而不是反对它 – 提供我已有的信息,以便我们的观点达成一致
以上是否有可能? 如果是这样,怎么样?
额外的奖金问题:考虑方法调用被链接的情况。
$f = new Foo; $f->test()->chain()->moreChain(); // potentially runs fine
假设对$f->test()
的魔术调用返回适当的后续(可能,但不一定,也是魔术)调用将正常工作。 但是,由于我不知道告诉IDE什么是test()
它将其余的调用链标记为缺less的方法。 更糟的是,“降级严重性”设置不适用于这些警告,因为IDE不知道这些中间对象应该是什么类。
有没有可以解决这个问题的解决scheme?
更新
尽pipe使用@method
注释来logging魔术方法似乎是行得通的,但是我不得不假设目前这种方法存在几个问题,因为我只花了一点时间来研究这些相关的错误:
- types提示的方法参数不能与原语正常工作
- 注释适用于一个呼叫,但不适用于链接呼叫
我希望他们在合理的时间内解决问题。
那么,你可以进入首选项菜单下的检查 ,进入未定义 – >未定义的方法,并检查降级的严重性,如果__magic方法存在 。
这将使国旗不那么严重,(而不是警告,作为信息),这仍然会给你一个绿灯在你的文件检查。
除了在目标类上使用可能使用的每种方法的@method
或@method
PHPDoc符号之外,我没有其他任何东西。
通过降低检查的严重程度,而不是在全球范围内closures检查,您可以添加一条评论到单一行忽略那个特定的检查。
/** @noinspection PhpUndefinedMethodInspection */ Assertion::NullOrAssertionDoesNotExist();
基于Madara所说的话,我发现不pipe降级到什么程度,都不会降级,所以我为没有任何属性的未定义方法做了一个新的Severity,并closures了降级checkbox(见下图)
如果我现在将鼠标hover在我的魔术方法上,它仍会popup消息,但不会分散我的注意力。 比closures检查好一步,因为至less这样一个实际的未定义的方法仍然可以通过hover在名称上来检测
你可以使用一个dynamicvariables:
$test = 'test'; $chaine = $f->$test(); // no phpStorm flag, & the code works