源代码:
------------------------------------------------------------------------
<html>
<title>变量值设置</title>
<body>
<?php
$A = 10 ; // $A的值为10
$B = $A ; // $A的值复制给$B
$C = &$A ; // $A的内存位置给$C
echo "执行计算前 <br>";
echo "A=$A <br>" ;
echo "B=$B <br>";
echo "C=$C <p>";
$B=$B+10 ; // $B的值加10
$C=$C+20 ; // $C的值加20
echo "执行计算后:<br>" ;
echo "A=$A <br>"; // 显示$A,$B,$C的值
echo "B=$B <br>" ;
echo "C=$C ";
?>
</body>
</html>---------------------------------------------------------------------------------
运行结果:执行计算前
A=10
B=10
C=10
执行计算后:
A=30
B=20
C=30 想来想去也想不明白,为什么变量A的值在执行计算后会发生变化的
$C = &$A ; 把变量A的内存在址赋给C了,但是A本身的地址没变,值也没改变,为什么会由原来的10变了30,取出来的是C的值呢?
------------------------------------------------------------------------
<html>
<title>变量值设置</title>
<body>
<?php
$A = 10 ; // $A的值为10
$B = $A ; // $A的值复制给$B
$C = &$A ; // $A的内存位置给$C
echo "执行计算前 <br>";
echo "A=$A <br>" ;
echo "B=$B <br>";
echo "C=$C <p>";
$B=$B+10 ; // $B的值加10
$C=$C+20 ; // $C的值加20
echo "执行计算后:<br>" ;
echo "A=$A <br>"; // 显示$A,$B,$C的值
echo "B=$B <br>" ;
echo "C=$C ";
?>
</body>
</html>---------------------------------------------------------------------------------
运行结果:执行计算前
A=10
B=10
C=10
执行计算后:
A=30
B=20
C=30 想来想去也想不明白,为什么变量A的值在执行计算后会发生变化的
$C = &$A ; 把变量A的内存在址赋给C了,但是A本身的地址没变,值也没改变,为什么会由原来的10变了30,取出来的是C的值呢?
你把$C看成$A就可以了,对$C进行操作的话,相当于对$A进行操作(大部分情况下,像unset()的话就比较特殊了)。
那么$C和$A是指向$A原来的位置还是指向$C原来的位置呢?
还是将两个合并到一个位置了?
你都说了是把A的地址赋给C了,说明他们指向同一个地址,无所谓谁的,是共同的,
就好比一个抽屉有两把钥匙,A一把,C一把,你用C把锁开了,里面又放了20,A的打开了自然也就是30
$A = "10";
$C = $A;
$C = &$A;
在变量未修改值得情况下都是表示$C和$A同时指向一个zval,zval结构体里有refcount表示引用次数,is_ref表示变量修改时是否和zval体分离,php也就是利用is_ref区分传值与传引用的情况了。
详细的见解就去laruence的blog看看,这位牛人对底层颇有研究。
http://www.laruence.com/2008/09/19/520.html
这样在看的话就不会不明白了!
楼上说的很对!