在PHP 中引用的意思是:不同的名字访问同一个变量内容。
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容,在内存中存放的地址。
1.变量的引用
PHP 的引用允许你用两个变量来指向同一个内容
<?php
$a="ABC";
$b =&$a;
echo $a;//输出:ABC
echo $b;//输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG
echo $b;//输出EFG
?>
2.函数的引用传递(传址调用)
<?php
function test(&$a){
$a=$a+100;
}
$b=1;
echo $b;//输出1
test($b);//这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br>";
echo $b;//输出101
?>
如果**test(1);**的话就会出错,只能通过引用传递变量。
3.函数的引用返回
<?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 $b变量的内存地址与$a变量的内存地址 指向了同一个地方!!!
$a=5;//所以改变$a的值 也同时改变了$b的值
$a=test();//$b的值 为6
?>
4.对象的引用
<?php
class a{
var $abc="ABC";
}
$b=new a;
$c=$b;//等效于$b=new a; $c=&$b;
echo $b->abc;//输出ABC
echo $c->abc;//输出ABC
$b->abc="DEF";
echo $c->abc;//输出DEF
?>
5.引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 “&” 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 “&” 方式, 毕竟节省内存空间使用。
6.取消引用
unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。
<?php
$a = 1;
$b =& $a;
unset ($a);//不会 unset $b,只是 $a。
?>
7.global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:
<?php
$var =& $GLOBALS["var"];
?>
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
ps:
php传值:在函数范围内,改变变量值得大小,都不不会影响到函数外边的变量值。
PHP按引用:在函数范围内,对值的任何改变,在函数外部也有所体现,因为传引用传的是内存地址。
传值和传引用、传地址的区别:
1、传值,是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
2、传地址,是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
那么传地址以后,实参和行参都指向同一个对象
3、传引用,真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值