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]指向的其实是同一个地方。他们是引用关系。 而内部的实现机制,我还不是非常了解。