PHPStorm:由于include/require导致的未定义变量问题

50

PHPStorm显示其他文件中的所有变量都未定义,包括必需和包含的文件。 我在这里找到了解决方案(链接),但是在我禁用选项忽略“include”和“require”语句之后,IDE将忽略所有未定义的变量。

例如,我有一个名为a.php的文件,其中包含$name ='Bob'的内容,还有一个文件b.php,其中需要文件a.php。 当我在文件b.php中键入echo $name时,它按预期工作,并显示'Bob'。 但是,IDE会突出显示变量$name,并声称它未定义。 如果我禁用选项“未定义的变量” - 忽略“include”和“require”语句,则IDE将停止突出显示它。

通过该选项,我现在可以在文件b.php中编写任何变量,例如$sdadasdasdas,而IDE不会突出显示它。

PHPStorm能否理解哪些变量在已包含/已要求的文件中设置,哪些变量没有设置?


我认为这是一个类似的问题未定义变量PDO。 我在PHPStorm 8中使用它。 - Curtov
太烦人了,在历史代码的侧边栏里什么都看不到,因为它充斥着让人讨厌和无聊的警告信息。 - Dgloria
6个回答

78

以上所有答案都会移除或压制警告,我认为这不是一个好的解决方案。

最佳方案是添加带有文档块和使用变量的标头。

示例:

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

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


1
是的!你说得对!我喜欢这个解决方案,因为它不会修改我的共享代码库中的代码,我的意思是使用其他注释的代码不会影响其他程序员。 - hizmarck
@Pawel Hawro 这对我有用。我感到沮丧,因为我在 init.php 中实例化了一个对象,然后在 login.php 中 include 了 init.php,在我的 login.php 中,我实例化的对象/类出现了错误。但是按照您解释的添加文档块可以防止错误显示。(我同意抑制错误不是正确的方法) - CodeConnoisseur
不错,同时PhPStorm会为您提供lint反馈和自动完成。 - fustaki
我也喜欢这个解决方案,出于上述原因。它运行良好。谢谢@Pawel Hawro - user1794918
这个头文件应该放在哪里?我不确定它是应该放在被需要的文件中还是需要它的文件中(并且似乎在两者中都没有帮助)。 - Clonkex

41

正如hakre所指出的,这个警告可能是糟糕的代码气味的标志。但是,如果有先前的includerequire调用,您可以禁用PHPStorm对未定义变量的检查。

在设置/编辑器/检查/PHP/未定义变量中取消勾选名为"忽略'include'和'require'语句"的单选按钮。

输入图像描述

如果您不想禁用此检查,则可以使用PHPStorm的@noinspection注释单个语句禁用它。示例代码:

require $path; // $some_variable is defined in that file
/** @noinspection PhpUndefinedVariableInspection */
$config["DBSettings"] = [
    "server" => $some_variable
];

39

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

在此输入图片描述


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

11

是的,它是。然而,这应该提示您,您的代码很可能还存在另一个问题(Phpstorm不能具体警告),即您过度使用全局变量以及如何使用includerequire

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

对于PHPStorm本身,您可以使用注释来排除单个或多个语句,在某些地方禁用警告。但如果有许多“误报”,这很麻烦。此方法适用于任何检查警告。

请参见:


那么,实际上正确的修复方法是什么?函数在这方面似乎毫无帮助。 - FrankyBoy
@FrankyBoy:请查看后续答案 https://dev59.com/nmEh5IYBdhLWcg3wYSnt#35147818,其中展示了如何更专业地控制Phpstorm中的检查警告。此外,元文件可能有所帮助或者使用\@var定义。也许还可以定义为全局变量。 - hakre
这两种方法对我来说似乎都是绕过烦人的警告而不解决实际的潜在问题/反模式。我询问的是反模式的替代方案,而不是如何忽略警告。 - FrankyBoy
@FrankyBoy 请再详细描述一下你的反模式是什么,这样我才能在那个方向上给出建议。不了解更多背景情况很难提出建议。 - hakre

4

通过在我的函数顶部以及其他文件的顶部使用global $db,phpstorm可以找到该变量的声明和/** @var语句。请注意,保留html标记。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接