两者都运转良好。我只是好奇php如何解析这两个。他们在速度,效率等方面有区别吗?为什么php允许我们同时使用它们?
答案 0 :(得分:3)
区别在于第一个('literal')是一个字符串键,第二个是未定义的常量。 PHP允许你使用这两者,因为开发人员试图修复那些在阅读文档时没有注意的人的坏代码。速度有差异,因为第二个会引发警告 - 未定义的常数。基本上,不要使用第二个。
答案 1 :(得分:2)
如果您只使用literal
php,则将其识别为constant
。所以它试图找到那个常数,如果它失败了 - 它只是假设你的愿望是使用字符串文字'literal'
。但是,为了表明它没有找到常量,它会引发Notice
级错误。
因此,仅使用literal
有两个缺点:
literal
- 您将获得它的值(这是正确的用法),而不是字符串'literal'
Notice
。所以,除非你有一个定义了该名称的常量,否则不要只使用literal
。
答案 2 :(得分:0)
$ arrayName [literal]很糟糕,因为如果你有常量命名文字,你会得到意想不到的结果。当它没有常量命名文字时,php将文字转换为字符串'literal'
答案 3 :(得分:0)
http://php.net/manual/en/language.types.array.php
阵列做与不做 * 为什么$ foo [bar]错了? *
始终在字符串文字数组索引周围使用引号。例如, $ foo ['bar']是正确的,而$ foo [bar]则不是。但为什么?是很常见 在旧脚本中遇到这种语法:
<?php $foo[bar] = 'enemy'; echo $foo[bar]; // etc ?>
这是错误的,但它确实有效。原因是这段代码有一个 undefined constant(bar)而不是字符串('bar' - 注意引号)。 PHP可能在将来定义常量,不幸的是 这样的代码,具有相同的名称。它的工作原理是因为PHP自动 转换一个裸字符串(一个不相符的不带引号的字符串 将任何已知符号转换为包含裸字符串的字符串。对于 例如,如果没有名为bar的已定义常量,那么PHP将会 替换字符串'bar'并使用它。