发布网友
共1个回答
热心网友
第一次遇到这种问题,让人好奇,如何能发现这个问题的呢?
理解“赋值”概念很重要。例如,当执行 $a = 1; 时,并非创建一个名为 $a 的数据和值,而是在内存中建立一个指向数据1的地址。接着,当 $b = &$a; 时,不是创建$ b指向$a的链接,而是创建指向同一个地址的两个链接。过程可以形象描述为:
1. 创建一个地址(箱A),并存入数据1。
2. $a 指向箱A。
3. $b 同时指向箱A。
若销毁 $a ,$b 仍然存在并指向相同的数据。当 $b 和 $a 同时指向箱A时,两者都能修改箱A内的数据。
若要 $b 赋值时不影响 $a,需改变指向。当 $b = $c; 时,$a 和 $b 都会输出$c的数据,实质是改变箱A的数据。相反,当 $b = &$c; 时,$b 指向$c对应的箱子(箱B),此时改变$c或$b的数据时,两者的输出同时更新。
回到问题核心:在PHP中,$GLOBALS['a'] = &$static_a; 代码将$GLOBALS['a']指向了一个新的箱子,$a和$GLOBALS['a']指向不同箱子后,$a的赋值操作不再影响$GLOBALS['a']。
若去掉 $GLOBALS['a'] = &$static_a; 中的 & 符号,$a 的赋值操作将再次有效。
简化代码并加以注释后,问题变得清晰。感觉对PHP的赋值和变量指向机制有了更深的理解。