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

Debian环境PHP 7.0中list()剥离引用的问题咨询

PHP 7中list()函数剥离引用的问题分析与解决

嘿,刚好碰到过类似的问题,我来给你拆解一下~

首先,你提到的这个现象确实是PHP版本升级带来的向后不兼容变更。先把你的复现代码清晰列出来:

$a = array('A');
$arr = array();
$arr[] = &$a;
var_dump($arr);
$arr[0]['X'] = 'X';
list($entry) = $arr;
$entry['Z'] = 'Z';
var_dump($arr);

现象对比

  • 在PHP 5.3/5.4中,执行这段代码后,第二个var_dump($arr)会看到数组里的元素已经被修改为包含'Z'的数组,因为list()会保留引用关系。
  • 但在你使用的PHP 7.0.27版本中,list($entry) = $arr这一步会创建一个拷贝,而不是引用。所以后续修改$entry['Z']只会改变拷贝的数组,原数组$arr不会受到影响。

原因:PHP 7对list()的行为变更

PHP官方在7.0版本中调整了list()的实现逻辑,明确取消了它返回引用的特性。这是为了让list()的行为更符合直观的“赋值”逻辑,避免之前版本中容易混淆的引用副作用。

解决方案

如果需要保留引用关系,直接放弃使用list(),改用数组索引的引用赋值即可:

$a = array('A');
$arr = array();
$arr[] = &$a;
var_dump($arr);
$arr[0]['X'] = 'X';
// 替换list()为引用赋值
$entry = &$arr[0];
$entry['Z'] = 'Z';
var_dump($arr);

执行这段修改后的代码,你就能得到预期的输出:第二个var_dump($arr)会显示原数组已经被修改,包含'X'和'Z'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:29