【问题标题】:Is it okay to use array[key] in PHP?可以在 PHP 中使用 array[key] 吗?
【发布时间】:2010-03-08 23:03:59
【问题描述】:

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

你们觉得呢?

【问题讨论】:

  • 也许您的同事的意思是使用单引号或双引号都没有关系?因为这或多或少是正确的(除了变量不会在单引号中解析。)

标签: php array-key


【解决方案1】:

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


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

echo $array[key];

它将搜索用define 定义的常量,称为key——如果没有,if 将采用'key' 值。


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

define('key', 'glop');

不会的

echo $array['key'];

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

echo $array['glop'];


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

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

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


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

【讨论】:

  • 另外,每次 PHP 看到这个语法时,它都会抛出一个 E_NOTICE,这会产生一些性能开销。并且可能会在您的日志中写入一些垃圾邮件。因为您应该记录并解决通知级别的错误。
  • +1 不为数组键使用引号是愚蠢的,总有一天会造成麻烦。
  • @Frank : true ;在应该使用引号时使用引号的另一个充分理由!
  • “不再需要 [code]echo $array['key'];[/code]”...应该是“不需要 [code]echo $array[key] ;[/code] 了。”
【解决方案2】:

这是好的,加上其他人所说的,它在大多数情况下会触发错误:

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

【讨论】:

    【解决方案3】:

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

    $var = $array[bar];
    

    然而这种用法是正确的:

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

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

    【讨论】:

      【解决方案4】:

      来自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' 并使用它。

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          bad practice 不引用键值,原因有很多:

          1. 可能与有意义的符号名称发生冲突,例如define'd 常量。
          2. 有些键不加引号就无法表达(例如,键"]")。
          3. 不良习惯会在日后影响您(即关于 #1 和 #2)。
          4. 性能 - 搜索 define 需要时间。

          如果您想避免在名称周围输入引号,而这些名称只是您经常传递的事物的标准元素,也许您可​​能希望使用对象来代替,它采用object-&gt;property 语法而不是 @ 987654326@语法。

          【讨论】:

            猜你喜欢
            • 2012-12-25
            • 1970-01-01
            • 1970-01-01
            • 2023-01-05
            • 1970-01-01
            • 1970-01-01
            • 2010-09-26
            • 2018-10-07
            • 2012-02-27
            相关资源
            最近更新 更多