55

我坐在一个包含几个类的大型代码库上,这些类通过神奇地实现的方法(使用__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. 针对特定类完全禁用此功能,或
  2. 与 IDE 合作而不是反对它——向它提供我已经拥有的信息,以便我们的观点一致

以上任何一种可能吗?如果是这样,怎么做?

额外的奖励问题:考虑方法调用被链接的情况。

$f = new Foo;
$f->test()->chain()->moreChain();   // potentially runs fine

假设魔术调用$f->test()返回适当的后续(可能但不一定也是魔术)调用将正常工作。但是,由于我不知道有什么方法可以告诉 IDEtest()返回什么,因此它会将调用链的其余部分也标记为缺少方法。更糟糕的是,“降级严重性”设置不适用于这些警告,因为 IDE 不知道这些中间对象应该是什么类。

有没有可以涵盖这种情况的解决方案?

更新

尽管用@method注释记录魔法方法似乎有效,但我不得不假设这种方法目前存在几个问题,因为我只花了一点工作就发现了这些相关的错误:

我确实希望他们在合理的时间范围内修复它们。

4

4 回答 4

46

好吧,您可以转到首选项菜单,在Inspections下,转到Undefined -> Undefined Method并检查Downgrade severity if __magic methods are present

这将使标志不那么严重(而不是警告,作为信息),这仍然会给您的文件检查开绿灯。

除了针对可能使用的每个方法在目标类上使用 PHPDoc 表示法@property之外,我不知道其他任何事情。@method

在此处输入图像描述

于 2012-09-25T12:36:49.947 回答
39

无需通过降低检查的严重性来全局关闭检查,您可以在单行中添加注释以忽略该特定检查。

    /** @noinspection PhpUndefinedMethodInspection */
    Assertion::NullOrAssertionDoesNotExist();
于 2016-09-29T14:27:37.223 回答
2

基于 Madara 所说的,我发现无论我将其设置为何种严重性,它都不会降级到我喜欢的程度,因此我为未定义的方法创建了一个新的严重性,该方法没有任何属性,并关闭了降级复选框(见下图)

在此处输入图像描述

如果我现在将鼠标悬停在我的魔法方法上,它仍然会弹出弹出消息,但不会分散我的注意力。比仅仅关闭检查要好一步,因为至少通过这种方式,仍然可以通过将鼠标悬停在名称上来检测实际的未定义方法

于 2016-02-18T10:08:47.693 回答
0

您可以使用动态变量:

$test = 'test';
$chaine = $f->$test();   // no phpStorm flag, & the code works
于 2016-01-28T14:00:12.150 回答