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

