为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
婷婷同学_ 2021-12-24 10:26:13
编辑:我从 Eclipse 版本 4.12.0 和 PDT 版本 6.2.0.201812112302 更新到 Eclipse 版本 4.13.0M3(预发布)和 PDT 版本 6.3.0.201908130957(预发布),我无法再重现该问题预发布版本,现在正在/** @var variableType $variableName */消除错误 - 在实际发布之前我不会肯定地说,但我很确定这只是一个错误。(已在开发中修复但尚未发布)我有这个非常简单的代码:<?phpdeclare(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 中的一个错误?)
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

/** @var array $config */

是完全正确的。即将推出的 PDT 6.3 已经支持这一点。


查看完整回答
反对 回复 2021-12-24
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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


您的选择是:


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)接受这样一个事实,即您确定以正确的方式包含它,并且 linter 警告您可能发生的事情,但您确定它没有发生。


IMO 你能做的最好的事情是选项 2 - 避免全局范围的副作用。


查看完整回答
反对 回复 2021-12-24
  • 2 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信