23

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

你们有什么感想?

4

6 回答 6

42

它不被认为是好的——即使它在大多数情况下都可以工作。


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

echo $array[key];

它将搜索一个常量,用 定义define,调用key-- 并且,如果没有,if 将'key'取值。


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

define('key', 'glop');

它不会采取

echo $array['key'];

不再; 相反,它将使用常量的值key——您的代码将与以下内容相同:

echo $array['glop'];


最后,至少有两个原因,不在密钥名称周围加上引号是不好的:

  • 它有可能无法达到您的预期- 这是非常糟糕的
    • 可能今天...
    • 但是下周/月/年呢?
    • 也许,有一天,你会是一个名字错误define的常量;-)
  • 这对性能不利:
    • 它必须在使用之前搜索一个常数'key'
    • 并且,正如评论中所说,它会生成通知(即使您禁用error_reportingand display_errors,仍然会生成通知/警告/错误,即使稍后丢弃)

所以:你不应该听那个人的意见:他错了:这很重要


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

于 2010-03-08T23:06:35.263 回答
6

这是不行的,并且添加到其他人所说的内容中,在大多数情况下会触发错误:

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

请参阅PHP 手册中的“为什么 $foo[bar] 错误?”部分。在此页面上的“数组注意事项”下:http: //php.net/manual/en/language.types.array.php

于 2010-03-08T23:09:03.200 回答
4

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

$var = $array[bar];

然而,这种用法是正确的:

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

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

于 2011-02-20T19:47:12.077 回答
3

来自PHP 手册 - 为什么 $foo[bar] 错误?

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

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

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

手册中有更多示例供您查看。

于 2010-03-08T23:10:22.323 回答
2

不引用键值是不好的做法,原因有很多:

  1. 可能与有意义的符号名称发生冲突,例如define'd 常量。
  2. 有些键不能在没有引号的情况下表示(例如, key "]")。
  3. 坏习惯会在以后咬你(即关于#1和#2)。
  4. 性能 - 搜索define' 需要时间。

如果您想避免在名称周围输入引号,而这些名称只是您经常传递的事物的标准元素,那么您可能希望使用对象来代替,它采用object->property语法而不是$array["element"]语法。

于 2010-03-08T23:06:08.117 回答
2

除非键实际上是一个常数,否则您没有理由不在键周围加上引号。

PHP 的工作方式是查找您输入的常量值,但如果找不到常量,它会采用字符串表示形式。

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

于 2010-03-08T23:08:21.867 回答