编辑:我从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之前不存在:
我如何告诉eclipse linter变量$ config确实存在?
(我真的以为答案是/** @var array $config */
,但显然不是。或者我做得正确,但这可能是短毛呢?)
答案 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-避免全局范围的副作用。