很多時候我們會看到這樣的程式碼(來自 CI 框架原始碼):
$class =& load_class('a','b');
我們都知道其中的'&'是指引用,但是它的作用是什麼呢?它能夠解決什麼樣的問題呢?帶著這些問題,我們開始了解下「引用返回」。
引用回傳
手冊裡是這麼寫的:引用回傳用在當想用函數找到引用應該被綁定在哪一個變數上面。不要用返回引用來增加效能,引擎足夠聰明來自己進行優化。僅在有合理的技術原因時才返回引用!若要回傳引用,使用此語法:
<?php class 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 錯誤。
似懂非懂?那我們來改寫程式吧,讓它變成一個常規的函數:
<?php class foo { public $value = 42; public function getValue() { return $this->value; } } $obj = new foo; $myValue = $obj->getValue(); $obj->value = 2; echo $obj->value; // 程序输出 2 echo $myValue; // 程序输出 42 ?>
現在能理解「引用返回用在當想用函數找到引用應該被綁定在哪一個變數上面時」這句話了吧,函數&getValue() 把引用綁定在成員變數$value 上了。正常來說,$obj = new foo; 產生的 $obj 是一個copy,它的成員變數 $value 與函數 getValue() 不存在「別名」(引用)關係。
看下面的簡單例子,試著去理解引用回傳。
<?php function &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); ?>
以上是什麼是php「引用回傳」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!