PHP循环中引用为何不指向同一内存地址?
PHP引用赋值的动态指向问题解析
你的困惑核心是没注意到引用赋值会动态改变变量的指向目标,不是引用逻辑矛盾,而是循环里的操作让$a和$b的指向关系发生了变化,一步步拆解给你看:
初始阶段
$a =& $b; var_dump($a); // null var_dump($b); // null
这一步确实是$a和$b指向同一个内存地址,值都是null,没问题。
循环内的关键操作
进入foreach循环,$key为'ha',执行$a =& $a[$key];,这个语句要分两步理解:
- 计算右侧表达式
$a[$key]:
此时$a还指向最初的null,PHP对null进行数组下标访问时,会自动将其转换为空数组,然后为这个数组添加键'ha',默认值为null。这一步直接修改了$a(也就是最初的那个内存地址)的值,所以原本指向这个地址的$b,自然就变成了['ha' => null]。 - 执行引用赋值
$a =& ...:
这一步会让$a放弃之前的指向(不再指向最初的那个数组),转而指向刚刚创建的$a['ha']对应的内存地址——也就是那个null值。
最终结果
这时候:
- $a的指向目标是数组
$b['ha']对应的null; - $b仍然指向最初的那个内存地址,也就是已经变成数组
['ha' => null]的变量。
所以才会出现var_dump($a)显示null,var_dump($b)显示数组的情况——它们已经不再指向同一个内存地址了。
简单说:PHP的引用不是“绑定两个变量永远同步”,而是让变量临时指向同一个值。当你给变量重新赋值引用时,它的指向就会改变,之前的绑定关系也就失效了。
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

