如何告诉eclipse php linter一个变量存在?

时间:2019-09-03 09:18:40

标签: php eclipse static-analysis eclipse-pdt

编辑:我从eclipse版本4.12.0和PDT版本6.2.0.201812112302更新到eclipse版本4.13.0M3(预发布)和PDT版本6.3.0.201908130957(预发布),并且我无法再复制预发行版本中的问题,现在执行/** @var variableType $variableName */可以使错误保持沉默-在实际发行之前,我不能肯定地说,但我很确定这只是一个错误。 (已在dev中修复,但尚未发布)

我有这个非常简单的代码:

<?php
declare(strict_types = 1);
namespace vaporfs;

/** @var array $config */
$config["db"]["dsn"] = "mysql:host=127.0.0.1;port=3306;dbname=vaporfs;charset=utf8mb4";
$config["db"]["username"] = "vaporfs";
$config["db"]["password"] = "ffaXIgcDAmXkB5iJXG";

仅此而已。 eclipse linter抱怨$ config在尝试使用$ config之前不存在:  enter image description here

我如何告诉eclipse linter变量$ config确实存在?

(我真的以为答案是/** @var array $config */,但显然不是。或者我做得正确,但这可能是短毛呢?)

2 个答案:

答案 0 :(得分:1)

/** @var array $config */

是完全正确的。即将推出的PDT 6.3已支持此功能。

答案 1 :(得分:0)

您将未定义的变量视为数组。短绒正在警告您,这是绝对正确的。这并不意味着该代码将无法正常工作。只是警告您,这可能有问题。注释在这里无济于事。变量在分配给它的那一刻就好像是数组一样,因此是数组,因此注释不会告诉任何新内容。 是否将这个文件包含在另一个文件中,该文件在包含config.php的范围内定义了变量,这无关紧要,因为linter会单独处理该文件。您还可以从未定义变量的上下文中包含文件,但此文件是lint无法实现的。因此,lint倾向于警告您,因为它认为可以将文件包含在未定义变量的范围内。这全都归结为您在全局范围内编写了代码,因此产生了副作用。当您包含更多此类文件时,全局范围将混合在一起,并且混合的方式取决于包含的顺序。

您的选择是:

1)确保已在config.php中定义

$config = [];
//the rest of your code here

if (!isset($config)) {
  $config = [];
}
// rest of your code here

但是您可能还需要检查它是否为数组,否则抛出异常。

2)从带有副作用的全局范围中删除代码,改为将其移至函数中:

function createConfig(array $config = []) {
  // your code comes here
  return $config;
}

3)坚持以下事实:您确定自己以正确的方式包括了它,而棉绒正在警告您有关可能发生的事情,但您确定没有发生。

IMO最好的办法是选择2-避免全局范围的副作用。