看了很多帖子,但是都不能理解,又去看了很多资料,终于名白了.记下备忘.
问题: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的写时复制特点,这个技巧一般用的不多,
但是当你需要对函数运算结果进行即时修改的话,那就可以用这个技巧了.