请教老师一个关于引用变量的问题
来源:2-2 PHP引用变量考察点(下)
小新在编程
2017-08-30
按照写时复制来讲,这里的$foo['love']应该输出1才对的,为什么是2呢?
<?php $foo ['love'] = 1; $bar = &$foo['love']; $tipi = $foo; $tipi['love'] = '2'; echo $foo['love']; //输出2 ?>
写回答
1回答
-
Jason
2017-08-30
是这样,数组内的每一个元素时存储在hash当中,你可以当作是一个独立的变量,当$bar = &$foo['love']时,其实是把这个hash当中的独立变量引用给$bar,当把$foo值赋值给$tipi时,由于没有引用,因此是COW,换言之,他们公用一个内存,意味着会把$foo['love']和$bar的引用关系也传递给$tipi,因此当$tipi['love']的值发生改变,不会触发写时拷贝,也就是说没有复制新的空间,但如果在$tipi=$foo直接对$tipi的值进行修改时,zend引擎不因为存在引用关系,就会触发写时拷贝,重新复制一个内存空间出来,我们可以进行测试是不是这样的,如果我们在$tipi=$foo后,直接给$tipi赋值问不是$tipi['love'],$tipi=['love' => 'test', 1,2,3,4],此时$foo['love']依然是之前的1,总结一句话,在$tipi=$foo后,只有$tipi被修改才会COW,修改$tipi['love']实则修改了$foo['love']和$bar,并且此时没有复制新空间。
132017-12-27
相似问题