函数引用与php中变量引用一样使用的是&符号了,今天我们就一起来看看函数的引用返回的一些例子,希望这些例子能够对各位有帮助.
引用返回
手册里是这么写的:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用
当你想将函数的返回引用绑定到某个变量时,PHP允许你这么做:
01 | function &returns_reference() |
02 | { |
03 | static $someref = 0; |
04 | $someref ++; |
05 | return $someref ; |
06 | } |
07 | |
08 | $newref = &returns_reference(); //引用返回,相当于 $newref = &$someref; |
09 | echo $newref ; //1 |
10 | //phpfensi.com |
11 | $notref = returns_reference(); //值传递的是副本 |
12 | $newref = 100; |
13 | echo $notref ; //2 |
14 | |
15 | $newref = 100; |
16 | echo returns_reference(); //101 |
可见,想让函数返回引用,必须在函数申明和赋值时都带上&操作符.
对于类中方法也是如此:
01 | class foo { |
02 | public $value = 0; |
03 | |
04 | public function &getValue() { |
05 | return $this ->value; |
06 | } |
07 | } |
08 | |
09 | $obj = new foo; |
10 | $myValue = & $obj ->getValue(); // $myValue is a reference to $obj->value, which is 42. |
11 | $obj ->value = 2; |
12 | echo $myValue ; |
一些简单的例子
看下面的简单例子,尝试去理解引用返回.
01 | <?php |
02 | function &test() |
03 | { |
04 | // 声明一个静态变量 |
05 | static $b = 0; |
06 | $b = $b +1; |
07 | echo $b ; |
08 | return $b ; |
09 | } |
10 | $a = test(); //这条语句会输出 $b 的值为 1 |
11 | $a = 5; |
12 | $a = test(); //这条语句会输出 $b 的值为2 |
13 | $a = &test(); //这条语句会输出 $b 的值为3 |
14 | $a = 5; |
15 | $a = test(); //这条语句会输出 $b的值 为6 |
16 | ?> |
17 | //程序运行结果: |
18 | 1 |
19 | 2 |
20 | 3 |
21 | 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。
再来个程序例子加深理解:
01 | <?php |
02 | /* |
03 | ** 值传递和引用传递,值传递传递的是值的一个复本,引用传递传递的是值指向的内存地址 |
04 | */ |
05 | // 函数的引用,定义时也要加上 & |
06 | function &func( $a , $b ){ |
07 | // 这里为了更直观看到效果,定义一个静态变量 |
08 | static $result = 0; |
09 | $result += $a + $b ; |
10 | echo $result . '<br />' ; |
11 | return $result ; |
12 | } |
13 | |
14 | $a = $b = 10; |
15 | // PHP里这样写函数的引用调用,和调用普通函数没有区别(只是将函数的返回值复制给$c这个变量,$c做任何改变不会影响上面函数中的$result) |
16 | // 要记住:PHP里的函数引用定义及调用都要在函数名前加上 & |
17 | $c = func( $a , $b ); |
18 | // 第一次执行func(),其静态变量$result的值变为 20(10+10) |
19 | // 改变$c的值,不会对下面一行语句产生影响 |
20 | $c = 666; |
21 | // 第二次执行func(),其静态变量$result的值变为 40(20+10+10) |
22 | $c = func( $a , $b ); |
23 | echo '<hr />' ; |
24 | // 这样才是PHP中引用函数的调用方式 |
25 | $d = &func( $a , $b ); |
26 | // 第三次执行func(),其静态变量$result的值变为 40(40+10+10) |
27 | $d = 888; |
28 | // 第四次执行func(),其静态变量$result的值变为 908(888+10+10) |
29 | $d = func( $a , $b ); |
30 | ?> |
转自:http://www.php-z.com/article-3402-1.html