PHPStorm:由include/require引起的未定义变量
Posted
技术标签:
【中文标题】PHPStorm:由include/require引起的未定义变量【英文标题】:PHPStorm: undefined variables caused by include/require 【发布时间】:2014-04-23 23:32:56 【问题描述】:phpStorm 显示来自其他文件的所有变量,无论是必需的还是包含的,都是未定义的。我找到了这个解决方案here,但是在我禁用该选项Ignore 'include' and 'require' statements
之后,IDE 忽略了所有未定义的变量。
例如,我有一个内容为$name = 'Bob'
的文件a.php
和一个文件b.php
,这需要文件a.php
。当我在文件b.php
中键入echo $name
时,它按预期工作并显示'Bob'
。但是,IDE 会突出显示变量$name
,声称它是未定义的。如果我禁用该选项'Undefined variable' - Ignore 'include' and 'require' statements
,IDE 将停止突出显示它。
使用该选项,我现在可以在文件b.php
中写入任何变量,例如$sdadasdasdas
,并且IDE 不会突出显示它。
PHPStorm 可以理解哪些变量设置在包含/必需的文件中,哪些没有设置?
【问题讨论】:
我认为这是一个类似的问题 [Undefined variable PDO][1]。我在 PHPStorm 8 中使用它。[1]:***.com/questions/20036690/undefined-variable-pdo/… 【参考方案1】:以上所有答案都删除或抑制了恕我直言不是好的解决方案的警告。
最好的解决方案是添加带有已使用变量的文档块的标题。
例子:
<?php
/**
* @var string $name
* @var FormData $form
*/
?>
这不仅可以防止显示“未定义变量”警告,还可以记录您的代码并使自动完成功能按预期工作。
【讨论】:
是的!你是对的!我喜欢这个解决方案,因为不要修改我的共享存储库中的代码库,我的意思是带有其他程序员无关紧要的其他注释的代码。 @Pawel Hawro 这对我有用。我很沮丧,因为我在 init.php 中实例化了一个对象,然后include
ed init.php 在 login.php 中,在我的 login.php 中,我实例化的对象/类是错误的。但是按照您的解释添加文档块会阻止显示错误。 (我同意抑制错误不是要走的路)
很好,同时 PhPStorm 将帮助您进行 lint 反馈和自动完成【参考方案2】:
正如 hakre 所指出的,这个警告可能是代码味道不好的迹象。但是,如果之前有 include
或 require
调用,您可以禁用 PHPStorm 对未定义变量的检查。
取消选中 Settings/Editor/Inspections/PHP/Undefined 变量中名为“忽略 'include' 和 'require' 语句”的单选按钮。
如果您不想禁用此检查,可以使用 PHPStorm 的 @noinspection annotation 为 单个语句 禁用它。示例代码:
require $path; // $some_variable is defined in that file
/** @noinspection PhpUndefinedVariableInspection */
$config["DBSettings"] = [
"server" => $some_variable
];
【讨论】:
【参考方案3】:启用“在当前文件之外搜索变量的定义”
【讨论】:
【参考方案4】:是的。但是,这应该暗示您的代码最有可能存在的另一个问题(Phpstorm 无法具体警告):除了您如何使用 include
和 require
之外,您还过多地利用了全局变量的使用。
您可以通过更多模块化代码来轻松改进这里,例如由making use of functions 带参数。此外,您可以考虑(但您不需要在 PHP 中)开始使用对象编写类和程序。
对于 PHPStorm 本身,您可以排除单个或多个带有注释的语句,以在某些地方禁用警告。但是,如果您有很多“误报”,这很麻烦。这个顺便说一句。适用于任何检查警告。
参见:
Suppressing Inspections (PHPStorm Webhelp) phpstorm warning php variable might not have been defined【讨论】:
那么解决这个问题的实际正确方法是什么?函数似乎在这方面根本没有帮助。 @FrankyBoy:请看后续回答***.com/a/35147818/367456,它展示了如何更专注地控制 Phpstorm 中的检查警告。元文件也可能有帮助或 \@var 定义。也许也定义为全局变量。 这两个对我来说似乎都是解决方法,只是摆脱讨厌的警告,而不解决实际的潜在问题/反模式。我问的是反模式的替代方案,而不是如何忽略警告。 @FrankyBoy 请多描述一下你的情况下的反模式是什么,然后我可能会在这个方向上提出建议。如果不了解更多上下文,很难提出建议。【参考方案5】:通过不仅在我的函数顶部使用global $db
,而且还在其他文件顶部使用,phpstorm 以某种方式找出了在哪里可以找到该变量的声明和/** @var
语句。
【讨论】:
【参考方案6】:就个人而言,我只是降低警告的严重性,然后无论您是否有先前的 include/require 语句,该警告都将适用。 Settings>>Editor>>Inspections>>PHP>>Undefined>>[highlight 'Undefined variable'],然后使用下拉菜单调整'Severity'。
【讨论】:
以上是关于PHPStorm:由include/require引起的未定义变量的主要内容,如果未能解决你的问题,请参考以下文章
require、include、require_once 和 include_once 之间的区别?