会,php 7+ 在表达式上下文将未初始化变量的 [] 解析为字符串偏移,触发警告或返回 null;需重点排查循环外裸赋值、函数实参用 []、多维未初始化三类场景,推荐 array_push() 替代并确保父级存在。

PHP 5.5 中 [] 赋值在 PHP 7+ 会报错吗?
会,但不是所有情况。PHP 5.5 允许未初始化变量直接用 $arr[] = $val 追加,而 PHP 7.0+ 在表达式上下文(如函数参数、嵌套赋值)中可能将 [] 解析为字符串偏移访问,触发 Warning: Cannot use a scalar value as an array 或返回 NULL。这不是语法错误,而是运行时行为变更,容易漏测。
哪些 [] 写法必须改?
重点排查三类高危模式:
-
$data[] = $item出现在循环外、且$data未显式声明为数组(如没写$data = []) -
func($arr[], $other)这类函数调用中直接使用[]作为实参 -
$matrix[$i][] = $val中$matrix[$i]本身未初始化(比如$matrix是空数组或null)
怎么改才安全又不啰嗦?
优先用 array_push() 替代裸 [],它语义明确、跨版本一致,且性能差异可忽略:
把 $list[] = $x; 改成 array_push($list, $x);
如果涉及多维结构,先确保父级存在:isset($grid[$row]) || $grid[$row] = []; 再执行 $grid[$row][] = $cell;
避免用 (array)$var 强转来“兜底”——它会静默丢弃非数组类型(如 int 变成空数组),掩盖逻辑缺陷。
升级后最容易被忽略的坑
这类问题往往只在特定数据分支触发,比如某个接口传入空字符串或 null 时,[] 才暴露为标量操作。光跑单元测试不够,必须用真实日志里的异常堆栈反查对应代码行,再结合 php -l 扫描全部 [] 出现位置,逐个确认左侧变量是否总为数组类型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











