答案 0 :(得分:5)
在$test[car]
中,car
预计为常量。常量是没有引号或前面$
的单词。如果您没有定义名为car
的常量,PHP将假设您的意思是'car'
。这是非常糟糕的行为,但事实就是如此。如果您在开发过程中激活了错误报告,那么您会看到很多错误指出这一点。
答案 1 :(得分:2)
它们不一定产生相同的结果。试试这段代码:
define('car', 'plain');
echo $test['car'] . "\n";
echo $test[car];
没有引号的版本不使用单词“car”作为索引 - 而是使用名为“car”的常量。如果未定义该常量,则假定常量的值为其名称。因此,在您的情况下使用它时会得到相同的结果。但是在我的例子中,结果会有所不同。
答案 2 :(得分:1)
前者是正确的;后者是PHP设计者选择(相当糟糕)的副作用。
$test[car]
完全起作用并且不会因语法错误而崩溃的原因是因为PHP将裸字(无法识别的符号,前缀为$
)视为常量,并且{ {3}}。因此,如果您未通过car
定义常量'car'
,则car
相当于define()
。
请为了所有美好和快乐的爱,不要依赖这个功能。这是一场等待发生的潜在维护噩梦。 (事实上,如果您在PHP上显示了通知级别的消息,您将看到有关使用未定义常量的消息。)
使用$test['car']
。
答案 3 :(得分:-1)
字符串恰好是数组键的区别。
因此,仅使用'car'
和car
而不使用数组会产生完全相同的效果。
'car'
是一个字符串,car
是一个非常糟糕的PHP功能:它实际上是一个constant
,它找不到该名称,被视为一个字符串。
虽然输出不一样,$test[car]
会产生错误信息。永远不应该使用过。
对于数组 - 几乎所有PHP语句都可以在[]
括号内使用 - 字符串,变量,常量,逻辑运算符,函数调用等。