我坐在一个包含多个类的大型代码库中,这些类通过神奇实现的方法(使用__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方法,我已经通过检查"降级严重性调整了严重程度。选项,但我更愿意:
上述任何一种可能吗?如果是这样,怎么样?
额外的红利问题:考虑方法调用被链接的情况。
$f = new Foo;
$f->test()->chain()->moreChain(); // potentially runs fine
假设对$f->test()
的魔术调用返回适当的内容,后续(可能但不一定也是魔法)调用将正常工作。但是,由于我不知道如何告诉IDE test()
返回什么,它会将调用链的其余部分标记为缺少方法。更糟糕的是,"降级严重程度"设置不适用于这些警告,因为IDE不知道这些中间对象应该是什么类。
是否有解决方案可以解决此问题?
即使使用@method
注释记录魔术方法似乎也有效,但我必须假设这种方法目前存在一些问题,因为它只花了我一些工作来解决这些相关的错误:
我希望他们能在合理的时间内解决这些问题。
答案 0 :(得分:42)
嗯,您可以转到偏好设置菜单,在检查下,转到 Undefined - >未定义的方法并检查如果存在__magic方法则降级严重性。
这会使旗帜不那么严重(而不是警告,作为信息),这仍然会让你对你的文件检查开绿灯。
除了可能使用的每种方法在目标类上使用@property
或@method
PHPDoc表示法之外,我没有其他任何意识。
答案 1 :(得分:24)
不是通过降低检查的严重程度来全局关闭检查,而是可以向单行添加注释以忽略该特定检查。
/** @noinspection PhpUndefinedMethodInspection */
Assertion::NullOrAssertionDoesNotExist();
答案 2 :(得分:2)
以Madara所说的为基础,我发现无论我将其设置为什么严重程度,它都不会降级到我喜欢的程度,所以我为未定义的方法创建了一个新的严重性没有任何属性,并关闭了降级复选框(见下图)
如果我现在将鼠标悬停在我的魔法上,它仍然会弹出弹出消息,但不会分散我的注意力。比关闭检查更好的一步,因为至少这样一种实际的未定义方法仍然可以通过将鼠标悬停在名称上来检测
答案 3 :(得分:0)
您可以使用动态变量:
$test = 'test';
$chaine = $f->$test(); // no phpStorm flag, & the code works