天天看點

php 函數引用、變量引用、對象引用的差別

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的資料拷貝,重新申請一塊記憶體進行存儲