PHP 5.4+ 推荐使用 [] 替代 array(),更简洁易读;字符串键名建议统一加单引号,数字键名不加引号;空数组不能当对象调用;JSON 解码默认返回数组,需显式指定 false 得对象。

PHP 里 array() 和 [] 哪个该用?
PHP 5.4 起,[] 是官方推荐的数组字面量语法,和 array() 完全等价,但更轻、更易读。老项目里看到
array()</code) 不用急着改,它在 PHP 8.x 依然完全可用。</p>
<p>常见错误是混用风格写嵌套数组,比如:<code>array("a" => ["x", "y"], "b" => array(1, 2))——可读性差,也容易漏括号。统一用 [] 更稳妥。
- 新代码一律用
[],包括空数组:[]而不是array() - PHP 5.3 及更早版本必须用
array(),否则报Parse error: syntax error, unexpected '[' - 函数参数里传数组时,直接写
foo(["a", "b"])比foo(array("a", "b"))少敲 5 个字符,且 IDE 更容易高亮识别
关联数组键名加不加引号?
不加引号只适用于纯字母、数字、下划线开头且不含特殊字符的键名;一旦含空格、短横线、点号或以数字开头,就必须加引号,否则解析失败或语义错乱。
比如 $arr = ["user-name" => "tom"] 不加引号会当成常量 user-name(实际未定义),触发 Notice: Use of undefined constant user-name;而 $arr = [123 => "id"] 合法,但 $arr = [123abc => "id"] 就会报错——因为解析器把 123abc 当作常量名。
立即学习“PHP免费学习笔记(深入)”;
- 保险起见:所有字符串键名都加单引号,如
['status' => 'active', 'user_id' => 123] - 数字键名(整型)不用引号,
[0 => 'first', 1 => 'second']等价于['first', 'second'] - 变量作为键名必须用花括号:
[$key => 'value'],不能写成[key => 'value'](那是字面量)
空数组声明后还能不能当对象用?
不能。$arr = []; 声明的是 array 类型,后续调用 $arr->method() 或 $arr->prop 会直接报 Fatal error: Uncaught Error: Call to a member function ... on array。
有人误以为 “PHP 数组很灵活”,就顺手把数组当对象链式调用,比如想写 $data['user']->getName(),结果 $data['user'] 是数组而非对象,立刻崩。
- 检查类型用
is_object($var),别靠经验猜 - 从 JSON 解码来的数据默认是数组(
json_decode($json)),要对象得加第二个参数false:json_decode($json, false) - 函数返回值不确定类型时,先
var_dump($result)看清结构,再决定用[]还是->
PHP 7.4+ 的方括号语法陷阱
PHP 7.4 引入了箭头函数和属性类型,但数组语法没变——所以你不会遇到“新旧数组语法冲突”的问题。真正容易踩的是「数组解构赋值」和「展开运算符」的兼容边界。
比如 [$a, $b] = $arr; 在 PHP 7.1+ 才支持;[...$arr1, ...$arr2] 展开语法是 PHP 7.4+ 才有。低版本直接运行会报 Parse error: syntax error, unexpected '...'。
- 如果项目需兼容 PHP 7.2 或更低,避免用展开语法,改用
array_merge($arr1, $arr2) - 解构赋值不要用于长度不确定的数组,
[$first] = $arr;当$arr为空时,$first不会被设为null,而是保持未定义状态 -
foreach遍历时,用foreach ($arr as $k => $v)最安全;别依赖隐式索引顺序,尤其当数组用unset()删除过元素时
数组看着简单,但键名类型、引用传递、序列化行为、JSON 编码时的 null 处理……每个环节都可能埋雷。最常被忽略的是:从外部输入($_GET、数据库、API)拿到的数据,永远先 is_array() 再操作,别信文档说“它应该是个数组”。









