首頁  >  文章  >  後端開發  >  php自訂函數引用回傳是什麼?引用回傳實例詳解

php自訂函數引用回傳是什麼?引用回傳實例詳解

伊谢尔伦
伊谢尔伦原創
2017-06-27 09:20:231093瀏覽

引用回傳

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

當你想將函數的回傳參考綁定到某個變數時,PHP允許你這麼做:

function &returns_reference()
{
  static $someref = 0;
  $someref++;
  return $someref;
}
 
$newref = &returns_reference();//引用返回,相当于 $newref = &$someref;
echo $newref; //1
//phpfensi.com
$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.&#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