問題:php在聲明函數時,函數名前面的&符號有什么用?
一直想不通.很多帖子說類似於變量的$a=&$b,但是$b在聲明的時候前面可沒有加&符號啊?那么這個函數名前面加&有什么用呢?
很多人看的都是網上的例子,先用網上例子試一下:
function &test(){
static $b = 0; //聲明一個靜態變量
$b = $b+1;
return $b;
}
$a = test(); //輸出 $b 的值為:1
$a = 5;
$a = test(); //輸出 $b 的值為:2
$a = &test(); //輸出 $b 的值為:3
$a = 5; //$b的值變為了5
$a = test(); //輸出 $b 的值為:6
這看不出什么,$a是函數test的引用嗎?那么繼續
function &test(){
static $b = 0; //聲明一個靜態變量
$b = $b+1;
return $b;
}
$a = test(); //輸出 $b 的值為:1
$a = 5;
$a = test(); //輸出 $b 的值為:2
$a = &test(); //輸出 $b 的值為:3
echo $a; //輸出$b 的值還是3
也就是說,如果$a是test函數的引用,那么echo $a的話會再次調用函數,那么$b的值會再次加1才對
但是$a的值沒有變,也就是說,$a保存的是test函數返回值的引用,即$b的引用.所以說相當於$a=&$b.
也正因為如此,如果要實現對函數結果的引用:
1.在賦引用的時候,test前要加&
2.在聲明的時候函數名前要加&,表示可以返回函數執行結果的一個引用
3.同時函數必須有返回值,廢話,沒返回值那引用誰?
舉個沒有歧義的例子:
function &abc($n){
$arr=array('aaa','bbb','ccc');
return $arr[$n]; //將數組的第二個元素返回
}
$tem=&abc(1); //這里只能得到數組的第二個元素的引用,因為只返回了第二個元素
$tem='ddd'; //這里將數組的第二個元素的值改變成了'ddd'
是不是更好理解?
這個特點一般用來返回一些比較占空間的值,比如大的字符串等,但由於php的寫時復制特點,這個技巧一般用的不多,
但是當你需要對函數運算結果進行即時修改的話,那就可以用這個技巧了.
php函數前面加&符號的意思是函數的引用返回,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
下面解釋下:
通過這種方式$a=test();得到的其實不是函數的引用返回,這跟普通的函數調用沒有區別.
至於原因: 這是PHP的規定
php規定通過$a=&test(); 方式得到的才是函數的引用返回.
至於什么是引用返回呢(PHP手冊上說:引用返回用在當想用函數找到引用應該被綁定在哪一個變量上面時。)
用上面的例子來解釋就是
$a=test()方式調用函數,只是將函數的值賦給$a而已, 而$a做任何改變 都不會影響到函數中的$b.
而通過$a=&test()方式調用函數呢, 他的作用是將return $b中的 $b變量的內存地址與$a變量的內存地址,
指向了同一個地方. 即產生了相當於這樣的效果($a=&b;) 所以改變$a的值,也同時改變了$b 的值 ,所以在執行了:
$a=&test(); $a=5; 以后,$b的值變為了5 ......
php函數前面加&符號是什么意思?有的函數前面會加&,因為很少見到,所以不明白php函數前面加&符號是什么意思
那么,php函數前面加&符號有什么作用呢
- function &test()
- {
- static $b=0;//申明一個靜態變量
- $b=$b+1;
- echo $b;
- return $b;
- }
- $a=&test();//這條語句會輸出 $b的值 為1
- $a=6;
- test();//這條語句會輸出$b的值 為7
php變量前面加&符號是什么意思
先看一個示例
- $foo = 321;
- $bar = &$foo;
- $bar = 123;
- print $foo;
那么輸出的結果將會是什么呢
- 123
為什么會這樣呢?
改動新的變量將影響到原始變量,這種賦值操作更加快速
注意:只有命名變量才可以傳地址賦值
就是說,改變了$bar的值,也就改變了$foo的值了
https://justcoding.iteye.com/blog/652937
原文:https://blog.csdn.net/csdn_dengfan/article/details/53907416

