PHP命名索引是否无需加引号?两种数组定义是否等价?
PHP数组字符串索引:引号要不要加?
先直接给结论:你提到的这两个数组定义在绝大多数日常场景下是等价的,但这背后藏着PHP解析的小细节,而且有些场景下引号是必须加的,容我慢慢说清楚。
为什么不加引号也能正常工作?
PHP在解析数组的键名时,对于没有用引号包裹的标识符(比如foo),会先去查找有没有同名的常量。如果找不到对应的常量,它就会自动把这个标识符当作字符串'foo'来处理——这就是为什么[foo => 'bar']和['foo' => 'bar']最终生成的数组看起来是一样的。
哪些场景必须加引号?
这几种情况,不加引号要么报错,要么会得到和预期完全不同的结果:
键名和已定义的常量重名时:
比如你之前用define('foo', 'my_constant')定义了一个常量,那$arr = [foo => 'bar']里的foo会被解析成常量值'my_constant',数组的键就变成了'my_constant'而不是你想要的'foo'。这时候必须加引号'foo' => 'bar'才能确保键是字符串'foo'。键名包含特殊字符时:
只要键名不是纯字母数字下划线开头的标识符(比如带空格的'my key'、连字符的'user-id'、中文'用户名'、或者'foo@bar'这种带符号的),不加引号直接写会触发语法错误,必须用引号包裹。键名以数字开头的字符串时:
比如'123abc'这种键名,如果你写成123abc => 'value',PHP会把开头的123当作数值,后面的abc无法解析,直接报错,必须加引号。
最佳实践
虽然PHP允许不加引号,但我个人强烈建议始终给字符串键名加上引号:
- 避免意外的常量冲突,防止出现难以排查的bug;
- 代码可读性更高,其他开发者一眼就能看出这是字符串键名,不用猜;
- 符合大多数PHP编码规范(比如PSR系列)的要求。
内容的提问来源于stack exchange,提问作者GTS Joe
相关产品推荐
相关产品推荐

