采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
按照写时复制来讲,这里的$foo['love']应该输出1才对的,为什么是2呢?
<?php
$foo
[
'love'
] = 1;
$bar
= &
];
$tipi
=
;
] =
'2'
echo
//输出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.3k 11
1.0k 10
1.0k 8
901 8
1.3k 7
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号