首頁  >  文章  >  後端開發  >  php引用傳值的詳細介紹

php引用傳值的詳細介紹

WBOY
WBOY原創
2016-07-25 09:00:031196瀏覽
  1. $a="ABC";
  2. $b =&$a;
  3. echo $a;//這裡輸出:ABC
  4. echo $b;//這裡輸出:ABC
  5. $b="EFG";
  6. echo $a;//這裡$a的值變成EFG 所以輸出EFG
  7. echo $b; //這裡輸出EFG
  8. ?>
複製程式碼

2、函數的傳址調用

  1. function test(&$a)
  2. {
  3. $a=$a+100;
  4. }
  5. }
  6. }
  7. }
  8. }
  9. }
}
$b=1;echo $b;//輸出1test($b); //這裡$b傳遞給函數的其實是$b的變數內容所處的記憶體位址,透過在函數裡改變$a的值就可以改變$b的值了
echo "
";

echo $b;//輸出101

複製程式碼
    注意,在這裡test(1);的話就會出錯,原因自己去想
  1. 3、函數的引用回
  2. function &test()

  3. {
  4. static $b=0;//申明一個靜態變數
  5. $b=$b+1;
  6. echo $b;
  7. return $b;
  8. }
  9. $a=test();/ /這條語句會輸出$b的值為1

  10. $a=5;
$a=test();//這條語句會輸出$b的值為2

$a=&test();//這條語句會輸出$b的值為3$a=5;$a=test();//這語句會輸出$b的值為6

?>

複製程式碼

解釋:  以此方式$a=test();得到的其實不是函數的參考返回,這跟普通的函數呼叫沒有差別 至於原因: 這是PHP的規定 PHP規定透過$a=&test(); 方式得到的才是函數的參考返回 至於什麼是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時。) 這句狗屁話 害我半天沒看懂

用上面的例子來解釋就是 $a=test()方式呼叫函數,只是將函數的值賦給$a而已, 而$a做任何改變 都不會影響到函數中的$b 而透過$a=&test()方式呼叫函數呢, 他的作用是 將return $b中的 $b變數的記憶體位址與$a變數的記憶體位址 指向了同一個地方 即產生了相當於這樣的效果($a=&b;) 所以改變$a的值 也同時改變了$b的值 所以在執行了 $a=&test(); $a=5; 以後,$b的值變為了5
    這裡是為了讓大家理解函數的引用回傳才使用靜態變數的,其實函數的引用回傳多用在物件裡
  1. 物件的引用:
  2. 類 a{
  3. var $abc="ABC";
  4. }
  5. $b=new a;
$c=$b;
echo $b->abc;//這裡輸出ABCecho $c->abc;//這裡輸出ABC$b->abc="DEF ";
echo $c->abc;//這裡輸出DEF

?>

複製程式碼

以上程式碼是在PHP5的運作效果 在PHP5 物件的複製 是透過引用來實現的。上列$b=new a; $c=$b; 其實等價於$b=new a; $c=&$b; PHP5中預設就是透過引用來呼叫對象, 但有時你可能想建立一個物件的副本,並希望原來的物件的改變不影響到副本. 為了這樣的目的,PHP定義了一個特殊的方法,稱為__clone .
    4、引用的作用 如果程式比較大,引用同一個物件的變數比較多,並且希望用完該物件後手工清除它,個人建議用"&" 方式,然後用$var=null的方式清除. 其它時候還是用php5的默認方式吧. 另外, php5中對於大數組的傳遞,建議用"&" 方式, 畢竟節省內存空間使用。
  1. 5、取消引用 當你 unset 一個引用,只是斷開了變數名稱和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如:
$a = 1;$b =& $a;
unset ($a);

$b =& $a;

unset ($a);

?>

複製程式碼
  1. 不會unset $b,只有$a。
  2. 6、global 引用 當用 global $var 宣告一個變數時實際上建立了一個到全域變數的參考。也就是說和這樣做是相同的:
$var =& $GLOBALS["var"];?> 複製程式碼

這意味著,例如,unset $var 不會 unset 全域變數。 $this 在一個物件的方法中,$this 永遠是呼叫它的物件的參考。 //下面再來個小插曲 php中對於位址的指向(類似指標)功能不是由使用者自己來實現的,是由Zend 核心實現的,php中引用採用的是「寫時拷貝」的原理,就是除非發生寫入操作,指向同一個位址的變數或物件是不會被拷貝的。

通俗的講 1:如果有下面的程式碼 $a="ABC"; $b=$a; 其實此時 $a與$b都是指向同一記憶體位址 而並不是$a與$b佔用不同的記憶體

2:如果在上面的程式碼基礎上再加上如下程式碼 $a="EFG";

由於$a與$b所指向的記憶體的資料要重新寫一次了,此時Zend核心會自動判斷,自動為$b產生一個$a的資料拷貝,重新申請一塊記憶體進行儲存。

您可能有興趣的文章: php引用傳值的實例詳解 php引用的實例碼 php引用的實例詳解 有關PHP引用的解釋 php引用(&)符號詳解 有關php變數參考、函數傳址以及物件參考的實例解析 透過實例理解php中傳值與傳引用的差異 透過實例看php位址引用的效率問題 有關php引用位址改變變數值的問題 PHP中的引用,「&」解釋



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn