PHP引用就是在变量、函数或对象前面加上&符号,在PHP中引用的含义是:不同的名字访问同一个变量内容。
变量的引用
PHP的引用允许用两个变量来指向同一个内容。
$a = 'ABC';
$b = &$a;
echo $a; //Output:ABC
echo $b; //Output:ABC
$b = 'EFG';
echo $a; //Output:EFG
echo $b; //Output:EFG函数的传址调用
function test(&$a)
{
$a = $a+100;
}
$b = 1;
echo $b; //Output:1
test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo '<br/>';
echo $b; //Output:101函数的引用返回
function &test()
{
static $b = 0;
$b += 1;
echo $b.'<br>';
return $b;
}
$a = test(); //Output:$b->1
$a = 5;
$a = test(); //Output:$b->2
$a = &test(); //Output:$b->3
$a = 5;
$a = test(); //Output:$b->6通过$a=test();得到的其实不是函数的引用返回,与普通函数没有区别。这是因为:PHP规定,通过$a=&test();方式得到的才是函数的引用返回。PHP手册上说,引用返回用在当想函数找到引用应该被绑定在哪一个变量上面时。
所以,上例解释就是:
$a=test()只是将函数的值赋给$a而已,而$a做任何改变都不会影响到函数中的$b
通过$a=&test()的作用是将return $b中的$b的内存地址与$a变量的内存地址指向了同一个地址,产生了类似$a=&$b的效果,所以改变$a值的同时也改变了$b的值。
对象的引用
class a
{
var $abc = 'ABC';
}
$b = new a;
$c = $b;
echo $b->abc; //ABC
echo $c->abc; //ABC
$b-abc='DEF';
echo $c->abc; //DEF在PHP5中对象的复制是通过引用来实现的。
上例中的$b=new a;$c=$b;基本等效于$b=new a;$c=&$b;
PHP5中默认是通过引用来调用对象的,又是你可能想建立一个对象的副本,而原来的对象的改变不影响到副本,可以使用PHP的__clone
引用的作用:如果程序比较大,引用同一个对象的变量比较多,且希望用完该对象后手工清楚,建议使用"&"方式,然后用$var=null的方式清楚。
PHP5中对于大数组的传递,建议使用"&"方式,毕竟节省内存控件的使用。
当使用unset一个引用,只是断开了变量名和变量内容之间的绑定,而不意味着变量内容就被销毁了。
PHP中对于地址的指向(类似指针)功能不是由用户自己来实现的,而是由Zend核心来实现的,PHP中采用的是“写时拷贝”的原理,除非发生写操作,指向同一个地址的变量或对象是不会被拷贝的。
换句话说,如果有以下代码
$a = 'Hello';
$b = $a;其实此时$a和$b都是指向同一个内存地址,而并不是$a和$b占用不同的内存
如果在上面代码基础上加上
$a = 'Wrold';由于$a和$b所指向的内存数据都要重写一次了,此时Zend核心就会自动判断,自动为$b产生一个$a的数据拷贝,重新申请一块内存进行存储。
251

被折叠的 条评论
为什么被折叠?



