php函數引用返回的詳解

來源:互聯網
上載者:User

引用返回

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

當你想將函數的返回引用綁定到某個變數時,PHP允許你這麼做:

function &returns_reference()
{
    static $someref = 0;
    $someref++;
    return $someref;
}
 
$newref = &returns_reference();//引用返回,相當於 $newref = &$someref;
echo $newref; //1
 
$notref = returns_reference(); //值傳遞的是副本
$newref = 100;
echo $notref; //2
 
$newref = 100;
echo returns_reference(); //101

可見,想讓函數返回引用,必須在函數申明和賦值時都帶上&操作符。
對於類中方法也是如此:

class foo {
    public $value = 0;
 
    public function &getValue() {
        return $this->value;
    }
}
 
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;


一些簡單的例子

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

<?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

?>
程式運行結果:

1
2
3
6

儘管函式宣告方式是 function &test() 這樣,但我們通過這種方式 $a = test() 的函數調用得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別。PHP 規定通過 $a = &test() 這種方式得到的才是函數的引用返回。
用上面的例子來解釋就是,$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.