Php 如何处理;在类“中找不到方法”;神奇实现方法的警告?
我坐在一个大型代码库上,其中包含几个类,这些类通过神奇的实现方法(使用Php 如何处理;在类“中找不到方法”;神奇实现方法的警告?,php,phpstorm,Php,Phpstorm,我坐在一个大型代码库上,其中包含几个类,这些类通过神奇的实现方法(使用\uuuu call和\uuuu 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 w
\uuuu call
和\uuuu 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()
方法不存在,因此它会在调用站点发出警告。这有点烦人,因为代码当然会按预期运行和行为
我已经通过检查“如果类中存在魔术方法,则降级严重性”选项降低了严重性,但我更愿意:
额外的奖金问题:考虑方法调用被链接的情况。
$f = new Foo;
$f->test()->chain()->moreChain(); // potentially runs fine
假设对$f->test()
的magic调用返回适当的结果,那么后续的调用(可能,但不一定也是magic)将正常工作。但是,因为我知道没有办法告诉IDEtest()
返回什么,所以它也会将调用链的其余部分标记为充满缺少的方法。更糟糕的是,“降级严重性”设置不适用于这些警告,因为IDE不知道这些中间对象应该是什么类
是否有一种解决方案也可以解决此问题?
更新
尽管用@method
注释记录神奇的方法似乎是可行的,但我不得不假设,目前这种方法存在一些问题,因为我只花了一点时间就发现了这些相关的bug:
我真的希望他们能在合理的时间范围内解决问题。好吧,你可以进入首选项菜单,在“检查”下,进入“未定义->未定义方法”并检查降级严重性(如果存在神奇方法)。 这将使该标志不那么严重(而不是警告,作为信息),这仍然会为您的文档检查亮起绿灯 对于可能使用的每个方法,除了在目标类上有
@property
或@method
PHPDoc符号之外,我什么都不知道
您可以使用动态变量:
$test = 'test';
$chaine = $f->$test(); // no phpStorm flag, & the code works
在Madara所说的基础上,我发现无论我将其设置为什么严重性,它都不会降级到我喜欢的程度,因此我为未定义的方法创建了一个新的严重性,它没有任何属性,并关闭了降级复选框(见下图)
如果我现在悬停在我的魔法方法上,它仍然会弹出消息,但除此之外,它不会分散我的注意力。这比仅仅关闭检查要好一步,因为至少这样,通过将鼠标悬停在名称上仍然可以检测到实际的未定义方法,而不是通过降低检查的严重性来全局关闭检查,因此您可以在单行中添加注释以仅忽略该特定检查
/** @noinspection PhpUndefinedMethodInspection */
Assertion::NullOrAssertionDoesNotExist();
也许为每种方法添加docblock都能起作用?@JvdBerg:对于每种可能的方法?不确定是trolling还是see…@Jon,请参阅:一般来说,您应该强烈避免创建版本标记。如果您希望在此类动态方法上进行代码完成和其他分析,那么使用
@method
是目前唯一的选择(在我看来也是唯一真实/正确的选择),因为它一次描述了一种方法,并提供了完整的细节(方法名、参数名/顺序和参数类型、返回类型)。@ilksignal@method
有效,很多东西都使用它。它用于类方法。用于“虚拟”属性@property
标记存在。没有看到代码示例--很难说那里有什么问题。我无法在设置窗口下找到要禁用的正确检查。但是还有另一种方法:将光标放在任何恼人的错误上,然后按Alt
+Enter
并查找“禁用检查”有一种快速方法可以打开类似于上图的首选项-->编辑器-->检查屏幕。将光标放在方法上,按Alt+Enter并选择添加方法-->编辑检查配置文件设置。这将打开类似于上图的屏幕,其中未定义的方法已高亮显示。您还可以调用('test')。但是它值得吗?您也可以使用$chain=$f->{'test'}();
保存一行:)这应该是可以接受的答案,因为它是“仅用于特定类”正如OP所希望的,你必须在每次出现之前就将其放在首位。如果你需要更多信息,可能会有用。我不确定在哪里更改版本。这个选项似乎很奇怪。为什么你要用这种phpdoc污染你的项目,而这只是为了在phpStorm中否认检查。比如说,你collegue使用了cough Aptanas对他们来说根本没有意义。摆脱这些“魔法域”
的最佳方法是添加phpdoc和它们的属性定义。我的示例是在单元测试中抑制PHPStorm通知,该单元测试旨在测试调用不存在的对象的行为。因此,添加docblock来表示存在某个对象这可能是错误的。由于我不是PHPStorm的作者,我只能建议什么是有效的解决方案。这不是理想的解决方案。这也不会起作用。您需要取消选中“降级严重性”以启用此严重性,然后您将以这种方式隐藏所有未定义的方法。