PHPStorm:由 include/require 引起的未定义变量

PHPStorm: undefined variables caused by include/require

提问人:kxc 提问时间:3/18/2014 最后编辑:Communitykxc 更新时间:11/28/2020 访问量:28440

问:

PHPStorm 显示其他文件中的所有变量,包括必需的和包含的,都是未定义的。我在这里找到了这个解决方案,但是在我禁用该选项后,IDE忽略了所有未定义的变量。Ignore 'include' and 'require' statements

例如,我有一个包含内容的文件,以及需要文件的文件。当我输入文件时,它按预期工作并显示。但是,IDE 会突出显示声称该变量未定义。如果禁用该选项,IDE 将停止突出显示它。a.php$name = 'Bob'b.phpa.phpecho $nameb.php'Bob'$name'Undefined variable' - Ignore 'include' and 'require' statements

使用该选项,我现在可以编写任何变量,例如在文件中,并且 IDE 不会突出显示它。$sdadasdasdasb.php

PHPStorm 可以理解哪些变量是在包含/必需的文件中设置的,哪些不是?

php 变量 undefined 需要 phpstorm

评论

0赞 Curtov 12/13/2014
我认为这是一个类似的问题 [未定义变量 PDO][1]。我在 PHPStorm 8 中使用它。[1]:stackoverflow.com/questions/20036690/undefined-variable-pdo/......
0赞 Dgloria 8/17/2023
太烦人了,在历史代码的侧边栏中看不到任何内容,因为它充满了烦人和无趣的警告。

答:

11赞 hakre 3/18/2014 #1

是的,它是。但是,这应该提示您代码最有可能遇到的另一个问题(并且 Phpstorm 无法特别警告):除了如何使用 和 之外,您还过多地利用了全局变量的使用。includerequire

您可以通过进一步模块化代码来轻松改进,例如使用带有参数的函数。此外,您可以考虑(但在 PHP 中不需要)开始使用对象编写类和程序。

对于 PHPStorm 本身,您可以排除带有注释的单个或多个语句,以在某些地方禁用警告。但是,如果您有很多“误报”,那就很麻烦了。顺便说一句。适用于任何检查警告。

另请参阅:

评论

0赞 FrankyBoy 9/30/2020
那么解决这个问题的实际正确方法是什么呢?函数在这方面似乎根本没有帮助。
0赞 hakre 9/30/2020
@FrankyBoy:请看后续的回答 stackoverflow.com/a/35147818/367456,更专心地展示了如何在 Phpstorm 中控制检查警告。此外,元文件可能会有所帮助或 \@var 定义。也许也可以定义为全局变量。
0赞 FrankyBoy 9/30/2020
对我来说,这两种方法似乎都是摆脱讨厌的警告的解决方法,而没有解决实际的潜在问题/反模式。我问的是反模式的替代方案,而不是如何忽略警告。
0赞 hakre 9/30/2020
@FrankyBoy 请再描述一下你案例中的反模式是什么,然后我可能会在这方面给出建议。如果不了解更多的背景,就很难提出建议。
41赞 Andreas Fröwis 2/2/2016 #2

正如 hakre 所指出的,这个警告可能是代码异味的迹象。但是,如果存在先前的 includerequire 调用,您可以禁用 PHPStorm 对未定义变量的检查。

取消选中 Settings/Editor/Inspections/PHP/Undefined 变量中名为“忽略'include'和'require'语句”的单选按钮。

enter image description here

如果你不想禁用这个检查,你可以通过使用 PHPStorm 的 @noinspection 注解来禁用它。示例代码:

require $path; // $some_variable is defined in that file
/** @noinspection PhpUndefinedVariableInspection */
$config["DBSettings"] = [
    "server" => $some_variable
];
4赞 Puggan Se 12/14/2016 #3

通过不仅在我的函数顶部使用,而且在其他文件之上使用,phpstorm 以某种方式找出在哪里可以找到该 var 的声明和语句。global $db/** @var

1赞 Geoff Kendall 4/13/2019 #4

就个人而言,我只会降低警告的严重性,无论您是否有先前的 include/require 语句,它都会适用。设置>>编辑器>>检查>>PHP>>未定义>>[突出显示'未定义变量'],然后使用下拉菜单调整“严重性”。

78赞 Pawel Hawro 6/22/2019 #5

以上所有答案都删除或禁止警告,恕我直言,这不是好的解决方案。

最好的解决方案是添加带有已使用变量的文档块的标题。

例:

<?php
/**
 * @var string $name
 * @var FormData $form
 */
?>

这不仅可以防止显示“未定义的变量”警告,还可以记录您的代码并使自动完成按预期工作。

评论

1赞 hizmarck 8/17/2019
是的!你是对的!我喜欢这个解决方案,因为不要修改我的共享存储库中的代码库,我的意思是带有其他程序员无关紧要的其他注释的代码。
0赞 CodeConnoisseur 1/3/2021
@Pawel Hawro 这对我有用。我很沮丧,因为我在 init.php 中实例化了一个对象,然后在登录名 .php 中编辑了 init.php,而在我的登录名 .php 中,我实例化的对象/类是错误的。但是,正如您所解释的那样添加文档块会阻止错误显示。(我同意抑制错误不是要走的路)include
0赞 fustaki 12/31/2021
很好,同时 PhPStorm 将帮助您进行 lint 反馈和自动完成
0赞 user1794918 7/8/2022
出于上述原因,我也喜欢这个解决方案。它运作良好。谢谢@Pawel Hawro
0赞 Clonkex 5/30/2023
这个标题应该放在哪里?我很困惑它应该进入所需的文件还是需要的文件(而且似乎两者都没有帮助)。
39赞 TomInCode 11/28/2020 #6

启用“在当前文件之外搜索变量的定义”

enter image description here

评论

2赞 Douglas Vicentini 12/14/2022
启用此设置可能会导致 PHPStorm 误读。例如:我有一个声明 .如果我需要或包含头文件,IDE 将指向当前脚本中甚至未包含的另一个文件(同一项目的另一个文件)。使用 PHPDoc 可以解决这个问题。header.php$name = 'user';index.php$name
1赞 V1xIII 1/11/2023
好点子。有没有办法全局指定将始终在其他地方定义的特定变量?或者甚至只是禁用对所有项目中特定名称变量的检查?
2赞 Déjà vu 3/6/2023
这就是解决方案。