You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7中使用array_push向引用变量添加元素引发语法错误咨询

PHP 7中array_push传引用报错的原因及解决办法

你遇到的这个语法错误确实是PHP 7带来的明确变化——从PHP 7.0开始,直接在函数调用时使用引用传递参数(比如array_push(&$list, $row)这种写法)已经被彻底禁止。之前PHP 5虽然允许这种写法,但官方早就标记为不推荐的实践,PHP 7直接把它升级成了语法错误,所以才会抛出unexpected '&'的提示。

至于你担心的“去掉&后$list数组中不会包含$row数组”,其实完全是多余的顾虑。看你的代码,每次循环里都会重新初始化$row = array();,这意味着每一轮循环的$row都是一个全新的数组实例,直接用array_push($list, $row)就会把这个新数组添加到$list里,根本不存在作用域导致的丢失问题。

甚至你可以把代码简化得更直观:

$list = [];
while (($data = fgetcsv($handle)) !== FALSE) {
    // 直接创建新数组并添加到$list,省去中间变量
    $list[] = [1];
}

如果还是想用原来的结构,只需要去掉&符号就能正常运行:

$list = array();
while (($data = fgetcsv($handle)) !== FALSE) {
    $row = array();
    $row[0] = 1;
    array_push($list, $row); // 移除&即可正常工作
}

为什么之前你会觉得需要传引用?可能是混淆了变量作用域和数组的传递机制。PHP里数组默认是“写时复制”的:当你把$row添加到$list后,只有后续修改$row的内容时,才会触发数组的复制操作。但在你的循环逻辑里,每次都会重新给$row赋值为新数组,所以每一次添加到$list的都是独立的数组,不会互相影响。

总结一下PHP 7的这个变化:官方移除函数调用时的引用传递语法,是因为这种写法容易引发逻辑混淆和潜在的bug,而绝大多数场景下,都可以通过更清晰的方式实现需求——比如你这个场景,完全不需要引用传递就能达到预期效果。

内容的提问来源于stack exchange,提问作者Splashlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:14:44