Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何处理;在类“中找不到方法”;神奇实现方法的警告?_Php_Phpstorm - Fatal编程技术网

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()
方法不存在,因此它会在调用站点发出警告。这有点烦人,因为代码当然会按预期运行和行为

我已经通过检查“如果类中存在魔术方法,则降级严重性”选项降低了严重性,但我更愿意:

  • 仅对特定类完全禁用此功能,或
  • 使用IDE而不是反对它——向它提供我已经掌握的信息,以便我们的观点一致
  • 上述任何一种可能吗?如果是,怎么做?

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

    $f = new Foo;
    $f->test()->chain()->moreChain();   // potentially runs fine
    
    假设对
    $f->test()
    的magic调用返回适当的结果,那么后续的调用(可能,但不一定也是magic)将正常工作。但是,因为我知道没有办法告诉IDE
    test()
    返回什么,所以它也会将调用链的其余部分标记为充满缺少的方法。更糟糕的是,“降级严重性”设置不适用于这些警告,因为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的作者,我只能建议什么是有效的解决方案。这不是理想的解决方案。这也不会起作用。您需要取消选中“降级严重性”以启用此严重性,然后您将以这种方式隐藏所有未定义的方法。