采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
按照写时复制来讲,这里的$foo['love']应该输出1才对的,为什么是2呢?
<?php $foo ['love'] = 1; $bar = &$foo['love']; $tipi = $foo; $tipi['love'] = '2'; echo $foo['love']; //输出2 ?>
是这样,数组内的每一个元素时存储在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,并且此时没有复制新空间。
老师,这样说改变数组中的一个元素不算是改变数组?
对于数组来说,因为是复合数据类型,里面的每一个元素其实都可以当做是一个变量,所以改变一个元素,相当于改变另外一个变量,写时拷贝只在这个数组被改变时发生
受教了
登录后可查看更多问答,登录/注册
全面、系统剖析PHP面试,拿下心仪Offer
1.2k 11
957 10
938 8
845 8
1.3k 7