【发布时间】:2010-03-08 23:03:59
【问题描述】:
像 $array[key] 这样没有单引号或双引号的数组可以使用吗?我认为这很糟糕,因为如果我不使用单引号或双引号,PHP 会首先查找常量。我的一位同事告诉我,这没关系。
你们觉得呢?
【问题讨论】:
-
也许您的同事的意思是使用单引号或双引号都没有关系?因为这或多或少是正确的(除了变量不会在单引号中解析。)
像 $array[key] 这样没有单引号或双引号的数组可以使用吗?我认为这很糟糕,因为如果我不使用单引号或双引号,PHP 会首先查找常量。我的一位同事告诉我,这没关系。
你们觉得呢?
【问题讨论】:
它不被认为是好的——即使它在大多数情况下都可以工作。
基本上,当 PHP 看到这个时:
echo $array[key];
它将搜索用define 定义的常量,称为key——如果没有,if 将采用'key' 值。
但是,如果您的代码前面有类似的内容:
define('key', 'glop');
不会的
echo $array['key'];
不再;相反,它将使用 key 常量的值——您的代码将与以下内容相同:
echo $array['glop'];
最后,至少有两个原因,不在键名周围加上引号是不好的:
define 一个名称错误的常量;-)'key'之前必须搜索一个常数
error_reporting 和 display_errors,通知/警告/错误仍然会生成,即使稍后丢弃)
所以:在这一点上你不应该听那个人的:他错了:这很重要。
如果您需要一些比人们在 stackoverflow 上告诉您的“更好”的“证明”,您可以将他指向手册的这一部分,作为参考:Why is $foo[bar] wrong?
【讨论】:
这是不好的,加上其他人所说的,它在大多数情况下会触发错误:
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
【讨论】:
这是错误的,会自动定义一个常量:
$var = $array[bar];
然而这种用法是正确的:
$var = "string $array[bar] ...";
为了与 PHP2 兼容,字符串上下文中仍然允许使用这种旧语法。引用密钥会导致解析错误,除非您还在它周围使用 { 花括号 }。
【讨论】:
来自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' 并使用它。
手册中有更多示例供您查看。
【讨论】:
除非键实际上是一个常量,否则您没有理由不在键周围加上引号。
PHP 的工作方式是查找您输入的常量值,但如果找不到常量,它会采用字符串表示形式。
如果有人在路上编辑你的代码并添加一个带有该键名的常量,那只会引起更多的麻烦。
【讨论】:
bad practice 不引用键值,原因有很多:
define'd 常量。"]")。define 需要时间。如果您想避免在名称周围输入引号,而这些名称只是您经常传递的事物的标准元素,也许您可能希望使用对象来代替,它采用object->property 语法而不是 @ 987654326@语法。
【讨论】: