PHP 7.2未改变大括号语法,需关注三类变更:未初始化变量用[]赋值触发警告、扩展运算符保留整数键导致合并异常、object类型提示要求显式判空,修复须前置声明、调用array_values或is_object校验。

PHP 7.2 本身不改变大括号 {} 的语法结构,所谓“大括号写法迁移”实际是误传——真正要处理的是三类行为变更:方括号数组赋值、扩展运算符键保留、以及 object 类型提示引入后对对象判空逻辑的影响。如果你在升级后发现 if ($obj->{prop}) 报错、$arr[] = $x 触发警告、或 [$a, $b] 合并结果和预期不符,问题不在大括号本身,而在它们所处的上下文。
方括号赋值必须初始化,否则触发 Warning
PHP 7.2 对未初始化变量使用 [] 语法会解析为字符串偏移访问,而非数组追加:
-
$data[] = 'item';在$data未定义时,PHP 7.2 报Warning: Cannot use a scalar value as an array,而 PHP 5.5 静默转为数组 - 高频出现在循环累加、配置构建、矩阵填充等场景
- 修复方式不是改大括号,而是前置声明:
$data = [];或改用array_push($data, 'item'); - 多维结构需显式预建:
isset($matrix[$i]) || $matrix[$i] = [];
扩展运算符 [...$arr] 保留原始键,整数索引不再自动重排
PHP 7.2 起,[$a, $b] 中的 $a 和 $b 若含整数键,不再被强制重索引,导致合并后键冲突或跳号:
- 例如
$a = [0 => 'x']; $b = [0 => 'y']; $res = [$a, $b];→ 结果为[0 => 'x', 0 => 'y'](后者覆盖前者),PHP 7.2+ 则为[0 => 'x', 1 => 'y'] - 但若
$a = ['k' => 'x']; $b = [0 => 'y'];,$res会保留'k'和0,不会重排字符串键 - 需要连续整数索引时,必须显式调用
array_values($res) - 单元测试中建议断言
array_keys($res)而非只看值
object 类型提示让 is_object() 判空逻辑更关键
PHP 7.2 支持 function foo(object $o): void,但该类型提示不接受 null 或标量——很多旧代码依赖大括号包裹的宽松判断,现在必须提前拦截:
立即学习“PHP免费学习笔记(深入)”;
- 错误写法:
if ($obj) { $obj->method(); }—— 若$obj是null,进入大括号后仍会因类型提示抛TypeError - 正确做法:先用
is_object($obj)或$obj instanceof SomeClass显式校验,再进大括号块 - 启用
declare(strict_types=1)后,函数内所有参数传递都受约束,大括号内的逻辑执行前已失败 - IDE 补全和静态分析会基于
object提示推断方法,但运行时仍需防御性检查
真正要盯住的不是大括号位置,而是它包裹的表达式是否隐含未声明变量、是否依赖旧版数组键重排、是否绕过了新增的类型约束。这些点不手动扫一遍,光调格式化工具没用。



















