如何处理魔法实现方法中的“类中找不到的方法”警告?

我坐在一个大型的代码库上,这个代码库包含了几个通过魔法实现的方法公开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方法的降级严重性”来调整严重性,但是我更愿意:

  1. 完全禁用此function为特定的类,或
  2. 使用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