没有引号的PHP数组访问

时间:2012-11-29 09:23:34

标签: php arrays apostrophe

我在现有的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那样的访问方法。

案例3是php中允许的正常编码风格吗?

3 个答案:

答案 0 :(得分:8)

这里发生的是,PHP看到名为test的{​​{3}}。如果定义了常量,则返回该值,但未定义该值,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".

这是为了向后兼容,你永远不应该使用它。如果您a constant,您会看到PHP抱怨它。

答案 1 :(得分:4)

如果你没有把密钥放在引号中,它将作为一个未定义的常量处理(假设它没有在任何地方定义),这可能现在有效,但在将来的PHP版本中可能会失败。因此它是错误的,PHP文档也指出这个变体也是错误的。查看“Arrays do's and don'ts”。

顺便说一下:如果你把密钥放在双引号中,它会把变量放到键名中。

答案 2 :(得分:1)

使用不带引号的数组键名称是PHP中的一项遗留功能。它最初是这样做的方式,但不再推荐它,并且仅支持向后兼容性。如果您启用了严格模式,它将发出警告消息。

它起作用的原因是它将此表单中的键名称视为常量。当PHP看到一个未知常量时,它默认为常量的名称作为值,因此它可以作为字符串替换。

如果你的程序中有define()设置了该常量的值,那么它会破坏。如果您的密钥名称包含空格,以数字开头或由于任何其他原因而是无效的常量名称,它也不起作用。

由于这些原因,不建议使用此方法。

但最重要的是,PHP开发人员公开表示这不是一个好习惯,这可能意味着未来的PHP版本会删除编写这样的代码的能力。