使用此代码:
$a[1]=1;
$a[2]=& $a[1];
$b=$a;
$b[2]=7;
print_r($a);
我希望输出为1
,因为$a
未通过引用$b
($a = & $b
)分配,但它是7
。为什么呢?
答案 0 :(得分:4)
您正在按值复制数组,但源数组的元素是引用。这些引用只是浅层复制到目的地。
php > var_dump($a);
array(2) {
[1]=>
&int(1)
[2]=>
&int(1)
}
php > $b=$a;
php > var_dump($b);
array(2) {
[1]=>
&int(1)
[2]=>
&int(1)
}
以下是通过引用复制数组的示例:
php > $c[1] = 1;
php > $c[2] =& $c[1];
php > var_dump($c);
array(2) {
[1]=>
&int(1)
[2]=>
&int(1)
}
php > $d =& $c;
php > var_dump($d);
array(2) {
[1]=>
&int(1)
[2]=>
&int(1)
}
php > $d = array(3,4,5);
php > var_dump($c);
array(3) {
[0]=>
int(3)
[1]=>
int(4)
[2]=>
int(5)
}
php > var_dump($d);
array(3) {
[0]=>
int(3)
[1]=>
int(4)
[2]=>
int(5)
}
如您所见,数组变量(不是元素)本身就是一个引用,因此修改$d
会影响$c
。重新分配$b
本身对$a
无效。
答案 1 :(得分:3)
这就是引用的工作原理。当你$a[2]=& $a[1];
做什么时,你说的是$ a的两个元素现在都拥有相同的变量。当你执行$ b = $ a,$ b和$ a是不同的变量时,它们内部的所有4个元素都指向同一个变量!尝试$b[3] = 7
并看到它没有被复制到$ a - 因为$ b和$ a不同,但是$ b [2]和$ a [2]不是!
参考文献有点乱,抱歉。除非必须,否则不要使用它们。
答案 2 :(得分:0)
这有助于我理解引用的内容:
http://www.php.net/manual/en/features.gc.refcounting-basics.php
使用xdebug调试有趣的案例也有帮助
例如,您可以“避免”私有属性:
class c{ private $a = 42; function &a(){ return $this->a; } function print_a(){ echo $this->a; } } $c = new c; $d = &$c->a(); echo $d; $d = 2; $c->print_a();
如果您没有声明它,则通过引用传递:
function f1(&$s) { $s++; } function f2($s) { $s--; } $s1 = 1; $s2 = 3; f1($s1); f2(&$s2); echo $s1.$s2;
也可以使用pass-by-reference
$ a = array(1,2,3); foreach($ a as $ key =>& $ value){ $ value = 1; } $ value = 2;