请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请教老师一个关于引用变量的问题

按照写时复制来讲,这里的$foo['love']应该输出1才对的,为什么是2呢?

<?php
$foo ['love'] = 1;
$bar  = &$foo['love'];
$tipi = $foo;
$tipi['love'] = '2';
echo $foo['love'];  //输出2
?>


正在回答 回答被采纳积分+3

1回答

Jason 2017-08-30 16:01:35

是这样,数组内的每一个元素时存储在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,并且此时没有复制新空间。

1 回复 有任何疑惑可以回复我~
  • no4990 #1
    老师,这样说改变数组中的一个元素不算是改变数组?
    回复 有任何疑惑可以回复我~ 2017-11-19 16:39:33
  • Jason 回复 no4990 #2
    对于数组来说,因为是复合数据类型,里面的每一个元素其实都可以当做是一个变量,所以改变一个元素,相当于改变另外一个变量,写时拷贝只在这个数组被改变时发生
    回复 有任何疑惑可以回复我~ 2017-11-21 15:26:17
  • 受教了
    回复 有任何疑惑可以回复我~ 2017-12-27 17:48:33
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信