首頁  >  文章  >  後端開發  >  PHP中的引用,「&」解釋

PHP中的引用,「&」解釋

WBOY
WBOY原創
2016-07-25 08:52:01999瀏覽
  1. $a =& $b
  2. ?>
複製代碼

複製代碼
  1. 複製代碼
  2. 複製代碼
這表示$a 和$b 指向了同一個變數。 註: $a 和 $b 在這裡是完全相同的,這並不是 $a 指向了 $b 或相反,而是 $a 和 $b 指向了同一個地方。 同樣的語法可以用在函數中,它回傳引用,以及用在 new 運算子中(PHP 4.0.4 以及以後版本):

$bar =& new fooclass();

$foo =& find_var ($bar);

? >
  1. 複製程式碼
  2. 註: 不用& 運算子導致物件產生了一個拷貝。如果你在類別中使用 $this,它將作用於該類別目前的實例。沒有用 & 的賦值將拷貝這個實例(例如物件)並且 $this 將作用於這個拷貝上,這並不總是想要的結果。由於效能和記憶體消耗的問題,通常你只想工作在一個實例上面。
  3. 儘管你可以用 @ 運算子來關閉建構函式中的任何錯誤訊息,例如用 @new,但用 &new 語句時這不起效果。這是 Zend 引擎的一個限制並且會導致一個解析錯誤。
  4. 引用做的第二件事是用引用傳遞變數。這是透過在函數內建立一個本地變數並且該變數在呼叫範圍內引用了同一個內容來實現的。例如:

function foo (&$var)

{

$var ;

}

$a=5;foo ($a);?>

複製代碼
  1. 將使$a 變成6。這是因為在 foo 函數中變數 $var 指向了和 $a 指向的同一個內容。更多詳細解釋請見引用傳遞。 引用做的第三件事是引用返回。
  2. 引用不是什麼
  3. 如前所述,引用不是指標。這意味著下面的結構不會產生你預期的效果:
function foo (&$var){

$var =& $GLOBALS[ "baz "]; }foo($bar);?>

複製程式碼
  1. 這將使foo 函數中的$var變數在函數呼叫時和$bar 綁定在一起,但接著又被重新綁定到了$GLOBALS[ "baz "] 上面。不可能透過引用機制將$bar 在函數呼叫範圍內綁定到別的變數上面,因為在函數foo 中並沒有變數$bar(它被表示為$var,但是$var 只有變數內容而沒有呼叫符號表中的名字到值的綁定)。
  2. 引用傳遞
  3. 你可以將一個變數透過引用傳遞給函數,這樣函數就可以修改其參數的值。文法如下:

function foo (&$var){

$var ;

}

$a=5;

foo ($a);

// $a is 6 here

?>

複製程式碼
  1. 注意在函數呼叫時沒有引用符號- 只有函數定義中才有。光是函數定義就足夠使參數透過引用來正確傳遞了。
  2. 以下內容可以透過引用傳遞: 變量,例如 foo($a)
  3. New 語句,例如 foo(new foobar())
  4. 從函數傳回的引用,例如:
function &bar(){

$a = 5;

return $a;
;
}
    foo(bar());
  1. ?>
  2. 複製程式碼
  3. 詳細解釋請參考參考回傳。
  4. 任何其它表達式都不能透過引用傳遞,結果未定義。例如下面引用傳遞的例子是無效的:

function bar() // Note the missing &{

$a = 5;

return $a;

}

foo(bar());

foo($a = 5) // 表達式,不是變數 foo(5) // 常數,不是變數?>

    複製程式碼
  1. 這些條件是PHP 4.0 .4 以及以後版本有的。
  2. 引用返回
  3. 引用回傳用在當你想用函數找出引用應該被綁定在哪一個變數上面。當返回引用時,使用此語法:

function &find_var ($param){return $ }

$foo =& find_var ($bar);$foo-> x = 2;?>

複製程式碼

本例中find_var 函數所傳回的物件的屬性將會被設定(譯者:指的是$foo-> x = 2; 語句),而不是拷貝,就和沒有用引用語法一樣。

註: 和參數傳遞不同,這裡必須在兩個地方都用& 符號- 來指出返回的是一個引用,而不是通常的一個拷貝,同樣也指出$foo 是作為引用的綁定,而不是通常的賦值。

取消引用 當你 unset 一個引用,只是斷開了變數名稱和變數內容之間的綁定。這並不意味著變數內容被銷毀了。例如:

  1. $a = 1;
  2. $b =& $a;
  3. unset ($a);
  4. $b =& $a;
  5. unset ($a);
?>
複製程式碼

不會unset $b,只是$a。

再拿這個和 Unix 的 unlink 呼叫來類比一下可能有助於理解。 引用定位

許多 PHP 的語法結構是透過引用機制實現的,所以上述有關引用綁定的一切也都適用於這些結構。一些結構,例如引用傳遞和返回,已經在上面提到了。其它使用引用的結構有: global 引用

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

這意味著,例如,unset $var 不會unset 全域變數。 $this 在一個物件的方法中,$this 永遠是呼叫它的物件的參考。 您可能感興趣的文章: php引用傳值的詳細介紹 透過實例理解php中傳值與傳引用的差異 透過實例看php位址引用的效率問題

有關php引用位址改變變數值的問題


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