【发布时间】:2019-09-03 09:18:40
【问题描述】:
编辑:我从 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 不存在:
我如何告诉 eclipse linter 变量 $config 确实存在?
(我真的认为答案是 /** @var array $config */,但显然不是。或者我做得正确,但它可能是 linter 中的错误?)
【问题讨论】:
-
你导入变量了吗?还是你在这个代码sn-p here中创建它?
-
@LLJ97 现在我正在那里创建变量,但将来我可能会在其他地方创建它,因此我不想在这里用
$config=[];声明/清除它,所以我希望 eclipse 假设变量已经存在在这里。 isset() 守卫似乎可以工作,但我希望有更好的方法:if(!isset($config)){ $config=[]; } -
但这不是一个错误,因为 PHP 允许使用未定义的变量(显然),但由于变量未初始化,eclipse 仍然是正确的。这并不漂亮,但日食是对的,IMO。如果您在其他地方创建并导入它,eclipse 会将其标记为未定义,因为 linter 忽略 require/include 语句。
-
@LLJ97 只是为了证明一点:现在我创建了一个内容为
<?php namespace vaporfs;$config=["foo"=>"bar"];require_once('config.php');var_dump($config);的新文件 - eclipse 仍然抱怨 $config 未定义,现在 eclipse linter 错误,$config 确实存在。我如何告诉 linter $config 已经存在? -
@LLJ97 顺便说一句,我在 2016 年遇到了同样的问题,eclipse linter 没有意识到存在一些变量。 2016 年的解决方案是明确告诉 linter 该变量与
/** @var variableType $variableName */存在,但似乎不适用于现代版本的 eclipse?那么现代的做法是什么? - 仅作记录,我现在使用的是 eclipse 版本 2019-06 (4.12.0),PDT 版本为6.2.0.201812112302,但我不记得我在 2016 年使用的是什么版本
标签: php eclipse static-analysis eclipse-pdt