&在php中表示按“引用”传递,我自己理解成“绑定地址”。
用在变量身上,可以把一个变量与另一个变量的地址绑定在一起。
$a="a";
// 变量默认拷贝值
$b=$a;
//&绑定后,改变$c,$a中任意一个变量的值,另一个也跟着变。
$c=&$a;
$a="aa";
echo 'a: '.$a."\n";
echo 'b: '.$b."\n";
echo 'c: '.$c."\n";
echo '-------------------'."\n";
$b="b";
echo '$b="b", $a: '.$a."\n";
$c="c";
echo '$c="c", a: '.$a."\n";
用在函数的形式参数身上,实际参数(变量)和形式参数也可以被绑定到一起。
//实参传递进来时与形参地址绑定到一起了,改变形参d值,实参自动改变。
function foo(&$f){
$f="f";
}
$bar="bar";
foo($bar); //这里不能加&
echo '$bar: '.$bar."\n"; //$bar="f"
用在函数名前边,可以把变量和函数的返回值绑定到一起。
// 绑定的是qux的返回值,也就是$q的地址。
function &qux()
{
//静态变量在程序离开它的作用域后,它的值能保存住。
static $q=0;
$q++;
return $q;
}
$u=100;
echo '$u=100, $u: '.$u."\n";
//此处没有绑定。
$u=qux();
echo '$u=qux(), $u: '.$u."\n";
$u=100;
echo '$u=100, $u: '.$u."\n";
$u=qux();
echo '$u=qux(), $u: '.$u."\n";
echo '-------------------'."\n";
//此时绑定了函数的返回值$q的值。
$u=&qux();
echo '$u=&qux(), $u: '.$u."\n";
//绑定后,改变$u的值,函数内的返回值$q也变成100.
$u=100;
echo '$u=100, $u: '.$u."\n";
//$q ++ 后变成101
$u=qux();
echo '$u=qux(), $u: '.$u."\n";
用在对象上可以一次销毁所有对象引用。
$a=new $A();
$b=$a;
$c=&$a;
$a=null;
php5对象默认按引用传递,所以用和不用&,改变一个对象的值,其他引用都跟着变。
但是,用了&后,如果把其中一个对象赋值null,绑定地址的对象就都销毁了,如果不用null,销毁一个,其他引用不会跟着销毁。
class A
{
public $aa;
function __construct()
{
$this->aa="aa";
}
}
$a=new A();
$b=$a;
$c=&$a;
echo $a->aa."\n";
echo $b->aa."\n";
echo $c->aa."\n";
$b->aa="hello";
//全都输出hello,证明用不用&都是按引用传递的。
echo $a->aa."\n";
echo $b->aa."\n";
echo $c->aa."\n";
$a=null; //或 $c=null; 效果是一样的。
//$a肯定不存在了。
echo $a->aa."\n";
//$b还能输出hello,证明不用&,销毁$a,不影响$b.
echo $b->aa."\n";
//$c也不存在了,说明使用&绑定的对象,销毁一个,另一个被销毁。
echo $c->aa."\n";
更多内容
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/10/2173092.html