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
相关产品推荐
相关产品推荐

