1.變量的引用
$y =1;
$x = $y;
$x = 2; //變量的指派操作相當于複制$y的記憶體位址指向另一個變量$x,互不影響
echo $x,$y;
$z = &$y;
$z = 5;
echo $y; //結果是5,$z和$y指向同一記憶體位址,修改值互相影響
2.函數引用傳回值
function &testfucc()
{
static $bb=0;//靜态變量
$bb=$bb+1;
echo $bb.'<br>';
return $bb;
}
$a=testfucc();//$b的值 為1
$a=5;
$a=testfucc();//$b的值 為2
$a=&testfucc();//$b的值 為3
$a=testfucc();//$b的值 為6
最後一個為什麼答案是6呢?
原因:執行完$a=&testfucc();将return $bb中的變量$bb的記憶體位址與$a變量的記憶體位址指向了同一個地方
即産生了相當于這樣的效果($a=&bb;) 是以改變$a的值 也同時改變了$bb的值
函數傳址
function test(&$a)
$a=$a+10;
$b = 1;
test(&$b) 這個意思就是把$b的記憶體位址傳給變量$a,$a發送改變,$b同樣也會改變
3.對象引用
class a{
var $abc="ABC";
$a = new a;
$b = $a; //對象的指派操作相當于 $b = &$a;互相影響,要想使原來的對象$a的改變不影響副本$b,可用__clone
$b->abc = 'ef';
echo $a->abc,$b->abc 結果相同
引用的作用
如果程式比較大,引用同一個對象的變量比較多,并且希望用完該對象後手工清除它,個人建議用 "&"
方式,然後用$var=null的方式清除. 其它時候還是用php5的預設方式吧. 另外, php5中對于大數組的傳遞,建議用 "&"
方式, 畢竟節省記憶體空間使用。
取消引用
當你 unset 一個引用,隻是斷開了變量名和變量内容之間的綁定。這并不意味着變量内容被銷毀了。例如:
<?php
$a = 1;
$b =& $a;
unset ($a);
?>
不會 unset $b,隻是 $a。
php中對于位址的指向(類似指針)功能不是由使用者自己來實作的,是由Zend核心實作的,php中引用采用的是“寫時拷貝”的原理,就是除非發生寫操作,指向同一個位址的變量或者對象是不會被拷貝的。
以下引用:http://blog.csdn.net/21aspnet/article/details/6952534
通俗的講
1:如果有下面的代碼
$a="ABC";
$b=$a;
其實此時 $a與$b都是指向同一記憶體位址 而并不是$a與$b占用不同的記憶體
2:如果在上面的代碼基礎上再加上如下代碼
$a="EFG";
由于$a與$b所指向的記憶體的資料要重新寫一次了,此時Zend核心會自動判斷 自動為$b生産一個$a的資料拷貝,重新申請一塊記憶體進行存儲