PHP有趣的细节:数组引用的一个内核bug
起初,我认为这是PHP内核的一个BUG。直到查看了PHP手册,才发现不是。PHP手册里面很细心的写了一段note:
如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。
请看代码:
<?php
// Example one
$arr1 = array(1);
echo "\nbefore:\n";
echo "\$arr1[0] == {$arr1[0]}\n";
$arr2 = $arr1;
$arr2[0]++;
echo "\nafter:\n";
echo "\$arr1[0] == {$arr1[0]}\n";
echo "\$arr2[0] == {$arr2[0]}\n";
输出:
before:
$arr1[0] == 1
after:
$arr1[0] == 1
$arr2[0] == 2
// Example two
$arr3=array(1);
$a=&$arr3[0];
echo"\nbefore:\n";
echo"\$a == $a\n";
echo"\$arr3[0] == {$arr3[0]}\n";
$arr4=$arr3;
$arr4[0]++;
echo"\nafter:\n";
echo"\$a == $a\n";
echo"\$arr3[0] == {$arr3[0]}\n";
echo"\$arr4[0] == {$arr4[0]}\n";
输出:
before:
$a == 1
$arr3[0] == 1
after:
$a == 2
$arr3[0] == 2
$arr4[0] == 2
?>
关于“Example two”,在赋值(拷贝)
$arr4=$arr3;
之前,还有
$a=&$arr3[0];
这是对数组第一元素建立引用。因此在$arr4对$arr3拷贝的过程中,把这引用关系也一同拷贝过去了。 所以,$a、$arr3[0]、$arr4[0]指向的其实是同一个地方。他们是引用关系。 而内部的实现机制,我还不是非常了解。