PHP 5.4+ 推荐用[]而非array(),二者行为一致但[]更简洁、解析快、类型推断好;需警惕键名隐式转换(如'08'→8)和多维追加时中间层未初始化的隐患。

PHP 中 array() 函数和方括号语法的区别
PHP 5.4+ 开始,[] 是定义数组的首选写法,比 array() 更简洁、解析更快,且语义更清晰。老版本(如 PHP 5.3)必须用 array(),但如今已基本无需兼容。
两者行为完全一致,但混用容易引发维护困惑。例如以下写法虽合法,但不推荐:
$a = array('a' => 1, 'b' => array(2, 3));
$b = ['c' => 4, 'd' => [5, 6]];
-
array()在 PHP 8.0+ 中已被标记为“语法糖”,无运行时开销,但视觉上更冗长 - 嵌套数组中统一用
[]可减少括号层级混乱,尤其在 JSON-like 结构里 - IDE 和静态分析工具(如 PHPStan)对
[]的类型推断支持更好
关联数组键名的隐式转换规则
PHP 会自动把某些字符串键转为整型,导致意外覆盖。比如 '08'、'0x10'、'1e2' 这类看似字符串的 key,实际会被当作数字处理。
$arr = [
'08' => 'octal?', // 实际变成 int(8) → 键为 8
'0x10' => 'hex?', // 转为 int(16)
'1e2' => 'float?', // 转为 float(100),再转为 int(100)
];
- 用
var_dump(array_keys($arr))可验证键是否被转换 - 若需保留原始字符串形式,务必加引号且避免数字开头的字符串(如改用
'id_08') - 从 JSON 解码来的数据(
json_decode($json, true))默认生成关联数组,其键始终为字符串,不受此影响
空数组声明与初始化的常见误操作
直接赋值 = [] 是最安全的方式;用 array() 或 new ArrayObject() 属于过度设计,除非有特殊需求。
立即学习“PHP免费学习笔记(深入)”;
- 不要写
$arr = array(); $arr[] = 'x';—— 多一次函数调用,无必要 - 避免
$arr = null; $arr[] = 'x';—— 触发 Notice:“Cannot use a scalar value as an array” - 函数返回可能为空时,应显式判断:
if (is_array($data) && !empty($data)) { ... },而非直接foreach($data as ...) - PHP 7.1+ 支持空合并运算符简化初始化:
$items = $input['list'] ?? [];
多维数组动态追加元素的陷阱
用 [] 向深层嵌套数组追加时,PHP 不会自动创建中间层级。例如 $arr['user']['posts'][] = $post; 在 $arr['user'] 未定义时会报 Warning。
- 正确做法是提前初始化或使用
??=(PHP 7.4+):($arr['user']['posts'] ??= [])[] = $post; - 传统兼容写法:
if (!isset($arr['user']['posts'])) $arr['user']['posts'] = []; - 用
ArrayObject或封装工具类可规避,但增加了复杂度,小项目不值得 - 注意
array_push()和[]效率差异:后者更快,且支持多值一次性追加($arr[] = $a; $arr[] = $b;)











