2012-11-29 31 views
6

我碰到一个现有的PHP源代码, 现场访问没有撇号这样的:$ _GET [测试]。PHP阵列访问不带引号

我不清楚,也不知道,这是一个可行的办法, 所以我写了一个简单的例子来进行测试:

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中正常的,允许的编码风格?

+1

我记得使用未定义的常量时会发出警告,并将其视为字符串。但不,这不是“允许的编码风格”。 –

+0

感谢您的回答!我检查了apache日志,它没有发出警告(php.ini:error_reporting = E_ALL&〜E_DEPRECATED; phpinfo:22527)。很高兴听到,这不是一个好风格! – Peter

回答

7

这里发生的事情是,PHP看到a constanttest。如果定义了常量,则返回该值,但未定义该值,则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". 

这是为了向后兼容性,你不应该使用它。如果你将turn on notices,你会看到PHP抱怨。

4

如果不把键放到引号中,它将作为一个未定义的常量处理(假设它没有在任何地方定义),现在可以使用,但在未来的PHP版本中可能会失败。因此,这只是错误的,PHP文档声明这个变体也是错误的。退房'Arrays do's and don'ts'。顺便说一句:如果你把键放到双引号中,它会把变量放到键名中。

1

使用不带引号的数组键名是PHP中的遗留功能。它最初是做这件事的方式,但不再推荐它,只是仍然支持向后兼容。如果您启用了严格模式,它会发出警告消息。

它工作的原因是它将此窗体中的键名称视为一个常量。当PHP看到一个未知的常量时,它默认使用该常量的名称作为值,因此它用作字符串替换。

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

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

但最重要的是,PHP开发人员已经公开表示这不是好的做法,这可能意味着未来的PHP版本将无法像这样编写代码。