天天看點

php函數傳回一個引用,php函數引用傳回的詳解

函數引用與php中變量引用一樣使用的是&符号了,今天我們就一起來看看函數的引用傳回的一些例子,希望這些例子能夠對各位有幫助.

引用傳回

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

當你想将函數的傳回引用綁定到某個變量時,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;

一些簡單的例子

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

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。

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

// 函數的引用,定義時也要加上 &

function &func($a,$b){

// 這裡為了更直覺看到效果,定義一個靜态變量

static $result = 0;

$result+=$a+$b;

echo $result.'

';

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 '';

// 這樣才是PHP中引用函數的調用方式

$d = &func($a,$b);

// 第三次執行func(),其靜态變量$result的值變為 40(40+10+10)

$d = 888;

// 第四次執行func(),其靜态變量$result的值變為 908(888+10+10)

$d = func($a,$b);

?>

本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!