可以在PHP中使用array [key]吗?

时间:2010-03-08 23:03:59

标签: php array-key

是否可以使用没有单引号或双引号的数组,如$ array [key]?我认为这很糟糕,因为如果我不使用单引号或双引号,PHP会先寻找常量。我的一位同事告诉我这没关系。

你们有什么想法?

6 个答案:

答案 0 :(得分:42)

不被视为正常 - 即使它在大多数情况下都有效。


基本上,当PHP看到这个时:

echo $array[key];

它将搜索一个由define定义的常量,名为 key - 如果没有,则会取'key'


但是,如果您的代码中有类似的内容:

define('key', 'glop');

不会采取

echo $array['key'];

了相反,它将使用 key常量的值 - 并且您的代码将与以下内容相同:

echo $array['glop'];


最后,由于至少有两个原因,不在关键名称旁边加引号是坏的:

  • 存在无法达到预期效果的风险 - 这非常糟糕
    • 今天可能......
    • 但下周/月/年呢?
    • 也许,有一天,你会define一个错误的名称的常量; - )
  • 这对表现不利:
    • 在使用'key'
    • 之前必须搜索常量
    • 并且,如评论所述,它会生成通知(即使您禁用了error_reportingdisplay_errors,仍会生成通知/警告/错误,即使稍后会被丢弃)< / em>的

所以:在这一点上你不应该听那个人:他错了:这很重要


如果您需要一些比人们在stackoverflow上告诉您的“更好”的“证据”,您可以将他指向本手册的这一部分,作为参考: Why is $foo[bar] wrong?

答案 1 :(得分:6)

没关系,加上其他人所说的,在大多数情况下都会触发错误:

8 Notice Use of undefined constant key - assumed 'key' in file: 'index.php' on line 46

请参阅PHP Manual中的“为什么$ foo [bar]错误?”在此页面上的“数组做和不做”下:http://php.net/manual/en/language.types.array.php

答案 2 :(得分:4)

这是错误的并且会自动定义一个常量:

$var = $array[bar];

但这种用法是正确的:

$var = "string $array[bar] ...";

为了与PHP2兼容,在字符串上下文中仍然允许使用这种旧语法。引用该键会导致解析错误,除非您还在其周围使用{花括号}。

答案 3 :(得分:3)

来自PHP Manual - Why is $foo[bar] wrong?

  

始终在字符串文字数组索引周围使用引号。例如,$ foo ['bar']是正确的,而$ foo [bar]则不是。但为什么?在旧脚本中遇到这种语法是很常见的:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
  

这是错误的,但它确实有效。原因是这段代码有一个未定义的常量(bar)而不是一个字符串('bar' - 注意引号)。 PHP可能在将来定义常量,不幸的是,这些代码具有相同的名称。它的工作原理是因为PHP自动将一个裸字符串(一个与任何已知符号不对应的不带引号的字符串)转换为包含裸字符串的字符串。例如,如果没有定义的名为bar的常量,那么PHP将替换字符串'bar'并使用它。

本手册中还有一些示例供您查看。

答案 4 :(得分:2)

由于多种原因,不引用键值是bad practice

  1. 与有意义的符号名称发生潜在冲突,例如define'd常量。
  2. 如果没有引用,则无法表达某些键(例如,键"]")。
  3. 不良习惯可以在以后咬你(即关于#1和#2)。
  4. 效果 - 搜索define需要时间。
  5. 如果你想避免在名字中输入引号,这些名称只是你经常传递的东西的标准元素,也许你可能想要使用对象,它采用object->property语法代替$array["element"]语法。

答案 5 :(得分:2)

除非密钥实际上是常量,否则你没有理由不在密钥周围加上引号。

PHP的工作方式是查找你所放置的常量值,但是如果找不到常量则需要它的字符串表示。

如果有人要在路上编辑你的代码并添加一个带有该密钥名称的常量,那么这只会引起更多麻烦。