首頁  >  文章  >  後端開發  >  什麼是php「引用回傳」?

什麼是php「引用回傳」?

伊谢尔伦
伊谢尔伦原創
2017-06-27 13:52:051088瀏覽

很多時候我們會看到這樣的程式碼(來自 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.&#39;<br />&#39;;
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 &#39;<hr />&#39;;
// 这样才是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中文網其他相關文章!

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