什麼是php“引用返回”?

來源:互聯網
上載者:User
很多時候我們會看到這樣的代碼(出自 CI 架構源碼):

$class =& load_class('a','b');

我們都知道其中的'&'是指引用,但是它的作用是什麼呢?它能夠解決什麼樣的問題呢?帶著這些問題,我們開始瞭解下“引用返回”。

引用返回

手冊裡是這麼寫的:引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時。不要用返回引用來增加效能,引擎足夠聰明來自己進行最佳化。僅在有合理的技術原因時才返回引用!要返回引用,使用此文法:

<?phpclass foo {    public $value = 42;    public function &getValue() {        return $this->value;    }}$obj = new foo;// $myValue is a reference to $obj->value, which is 42.// $myValue 是 $obj->value 的引用,它們的值都是 42$myValue = &$obj->getValue(); // 對 $obj->value 重新複製,會影響到 $myValue 的值$obj->value = 2;// prints the new value of $obj->value, i.e. 2.echo $myValue; // 程式輸出 2?>

本例中 getValue() 函數所返回的對象的屬性將被賦值,而不是拷貝,就和沒有用引用文法一樣。

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

如果試圖這樣從函數返回引用:return ($this->value);,這將不會起作用,因為在試圖返回一個運算式的結果而不是一個引用的變數。只能從函數返回引用變數——沒別的方法。如果代碼試圖返回一個動態運算式或 new 運算子的結果,自 PHP 4.4.0 和 PHP 5.1.0 起會發出一條 E_NOTICE 錯誤。

似懂非懂?那麼我們來改寫一下程式吧,讓它變成一個常規的函數:

<?phpclass foo {    public $value = 42;    public function getValue() {        return $this->value;    }}$obj = new foo;$myValue = $obj->getValue(); $obj->value = 2;echo $obj->value;  // 程式輸出 2echo $myValue; // 程式輸出 42?>

現在能理解“引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時”這句話了吧,函數 &getValue() 把引用綁定在成員變數 $value 上了。正常來說,$obj = new foo; 產生的 $obj 是一個copy,它的成員變數 $value 與函數 getValue() 不存在“別名”(引用)關係。

看下面的簡單例子,嘗試去理解引用返回。

<?phpfunction &test(){// 聲明一個靜態變數    static $b = 0;    $b = $b+1;    echo $b;    return $b;}$a = test();//這條語句會輸出 $b 的值為 1$a = 5;$a = test();//這條語句會輸出 $b 的值為2$a = &test();//這條語句會輸出 $b 的值為3$a = 5;$a = test();//這條語句會輸出 $b的值 為6?>

程式運行結果:1236

用上面的例子來解釋就是,$a = test() 這種方式調用函數,只是將函數的值賦給 $a 而已,而$a做任何改變都不會影響到函數中的$b。

而通過 $a = &test() 方式調用函數呢,它的作用是將 return $b 中的 $b 變數的記憶體位址與 $a 變數的記憶體位址指向了同一個地方。即產生了相當於這樣的效果 ($a=&$b), 所以改變 $a 的值也同時改變了 $b 的值。所以在執行了

$a = &test();    $a = 5;

以後,$b的值變為了5。

再來個程式例子加深理解:

<?php/*** 值傳遞和引用傳遞,值傳遞傳遞的是值的一個複本,引用傳遞傳遞的是值指向的記憶體位址*/// 函數的引用,定義時也要加上 &function &func($a,$b){ // 這裡為了更直觀看到效果,定義一個靜態變數static $result = 0;  $result+=$a+$b;echo $result.'<br />';return $result;} $a = $b = 10;// PHP裡這樣寫函數的引用調用,和調用普通函數沒有區別(只是將函數的傳回值複製給$c這個變數,$c做任何改變不會影響上面函數中的$result)// 要記住:PHP裡的函數引用定義及調用都要在函數名前加上 &$c = func($a,$b); // 第一次執行func(),其靜態變數$result的值變為 20(10+10)// 改變$c的值,不會對下面一行語句產生影響$c = 666;  // 第二次執行func(),其靜態變數$result的值變為 40(20+10+10)$c = func($a,$b);echo '<hr />';// 這樣才是PHP中引用函數的調用方式$d = &func($a,$b);  // 第三次執行func(),其靜態變數$result的值變為 40(40+10+10)$d = 888;// 第四次執行func(),其靜態變數$result的值變為 908(888+10+10)$d = func($a,$b);?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.