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 中实例化了一个对象,然后includeed init.php 在 login.php 中,在我的 login.php 中,我实例化的对象/类是错误的。但是按照您的解释添加文档块会阻止显示错误。 (我同意抑制错误不是要走的路) 很好,同时 PhPStorm 将帮助您进行 lint 反馈和自动完成【参考方案2】:

正如 hakre 所指出的,这个警告可能是代码味道不好的迹象。但是,如果之前有 includerequire 调用,您可以禁用 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 无法具体警告):除了您如何使用 includerequire 之外,您还过多地利用了全局变量的使用。

您可以通过更多模块化代码来轻松改进这里,例如由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引起的未定义变量的主要内容,如果未能解决你的问题,请参考以下文章

phpstorm怎样配置php

PhpStorm 完成,类型提示泛型

PhpStorm中的行间距

require、include、require_once 和 include_once 之间的区别?

require、include、require_once 和 include_once 之间的区别?

php的include(),require(),include_once(),require_once()