没有使用引号的PHP数组访问

11

我在一个现有的php源代码中遇到了一个现象,使用没有撇号的字段访问,例如:$_GET[test]。

我感到不确定,也不知道这是否是一种可行的方式, 所以我写了一个简短的示例进行测试:

echo "Array Test, fields without apostrophe, like \$_GET[fieldname]<BR><BR>";
$a = array();
$a['test'] = "ArrayValue";
echo "case 1 -> \$a['test']: " . $a['test'] . "<BR>";
echo "case 2 -> \$a[\"test\"]: " . $a["test"] . "<BR>";
echo "case 3 -> \$a[test]: " . $a[test] . "<BR>";

它有效,每个结果都得到了值(ArrayValue)。

我更喜欢像第2种情况这样的访问方法。

在php中,第3种情况是一种正常允许的编码风格吗?


1
我记得在使用未定义常量时会收到警告,并且它会被视为字符串。但是,这不是“允许的编码风格”。 - Alvin Wong
谢谢你的回答!我已经检查了Apache日志,没有任何警告(php.ini:error_reporting = E_ALL&〜E_DEPRECATED; phpinfo:22527)。很高兴听到这不是一个好的风格! - Peter
简单易懂,使用define()函数定义所有的键,例如define('test','test') - nodws
3个回答

15
在这里发生的是,PHP看到一个名为test常量。如果定义了该常量,则返回其值;如果未定义,则PHP将返回字符串"test"。例如:
$array = array("A" => "Foo", "B" => "Bar", "C" => "Baz")
define("B", "C");

echo $array[A];   // The constant "A" is undefined, 
                  // so PHP falls back to the string "A", 
                  // which has the value "Foo".
echo $array["B"]; // The result is "Bar".
echo $array[B];   // The value of constant "B" is the string "C".
                  // The result is "Baz".

这是为了向后兼容而存在的,你永远不应该使用它。如果你打开通知, 你会看到PHP会对此发出警告。


3
PHP 7.2 开始,将未定义的常量用作数组键值时会出现错误。https://www.php.net/manual/zh/language.types.array.php#language.types.array.donts - Jsowa

6
如果您不将键放入引号中,则它将被处理为未定义的常量(假设它未在任何地方定义),这可能现在可以工作,但在未来的PHP版本中可能会失败。因此,这是错误的,PHP文档也将此变体标记为错误。请查看“ Arrays do's and don'ts”。
顺便说一下:如果您将键放入双引号中,则会呈现键名内的变量。

1

在PHP中,使用数组键名而不带引号是一种遗留功能。这原本是一种方法,但现在不再推荐使用,只是为了向后兼容而仍然受支持。如果启用了严格模式,它将抛出警告消息。

它能够工作的原因是它将以这种形式看到的键名视为常量。当PHP看到未知常量时,默认将常量名称作为值,因此它可以作为字符串替换。

如果您的程序中其他地方有define()设置该常量的值,则会导致其失效。如果您的键名包含空格、以数字开头或由于其他原因无效,则它也无法工作。

因此,不建议使用此方法。

但最重要的是,PHP开发人员已公开表示这不是好的实践,这可能意味着未来的PHP版本将删除编写此类代码的能力。


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