首頁  >  文章  >  後端開發  >  php引用(&)符號詳解

php引用(&)符號詳解

WBOY
WBOY原創
2016-07-25 08:57:09876瀏覽
  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. }
  10. }
  11. $b=1;
echo $b;//輸出1
test($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;
  11. $a=test();//這條語句會輸出$b的值為2

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

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

複製程式碼
    解釋:  以此方式$a=test();得到的其實不是函數的參考返回,這跟普通的函數呼叫沒有差別。 至於原因:PHP的規定 PHP規定透過$a=&test(); 方式得到的才是函數的引用回傳。 至於什麼是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時。)。
  1. $a=test()方式呼叫函數,只是將函數的值賦給$a而已, 而$a做任何改變 都不會影響到函數中的$b 而透過$a=&test()方式呼叫函數呢, 他的作用是 將return $b中的 $b變數的記憶體位址與$a變數的記憶體位址 指向了同一個地方 即產生了相當於這樣的效果($a=&b;) 所以改變$a的值 也同時改變了$b的值 所以在執行了
  2. 類 a{
  3. var $abc="ABC";
  4. }
  5. $b=new a;
  6. $c=$b;
echo $b->abc;//這裡輸出ABC
echo $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 .
    5,引用的作用 如果程式比較大,引用同一個物件的變數比較多,並且希望用完該物件後手工清除它,個人建議用"&" 方式,然後用$var=null的方式清除. 其它時候還是用php5的默認方式吧. 另外, php5中對於大數組的傳遞,建議用"&" 方式, 畢竟節省內存空間使用。
  1. 6,取消引用 當你 unset 一個引用,只是斷開了變數名稱和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如:
$a = 1;$b =& $a;unset ($a);
$b =& $a;

unset ($a);

?>

複製程式碼
  1. 不會unset $b,只是$a。
  2. 7,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引用位址改變變數值的問題 PHP中的引用,「&」解釋



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