php的引用(就是在变量或者函数前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容.
1. 变量引用
从下面的例子可以看出,使用‘&’对变量进行引用传递后,改变任何一个变量的值都会影响到访问这个变量内容的变量。
<?php
$a = 100;
$b = &$a;
echo $a; //100
echo $b; //100
$b = 200;
echo $a; //200
echo $b; //200
?>
2.函数的传址调用
函数的传址调用也是同样的道理,需要注意的是不能在引用中传递常量,如test(100)就会引起报错。
<?php
$a = 100;
function test(&$b){
$b = $b*2;
return $b;
}
$c = test($a);
echo $a; //200
echo $c; //200
?>
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
$a = 5;
$a = test(); // 这条语句会输出 $b的值 为6
?>
从上面的例子可以看出,当用$a = test()的方式调用函数得到并不是引用的返回,而$a的改变也不会影响到$b。
只用通过$a = &test()的方式调用函数才会得到引用的返回,此时改变$a会影响函数中的$b。
3.global引用
在函数内部声明为 global 的变量,其实是创建了一个引用。
<?php
$a = 100;
function test(){
global $a;
$a = 1;
unset($a);
}
test();
echo $a; //输出1
?>
4.给引用再次赋予引用
先看个简单的例子。
<?php
$a = 'string';
$b = 1;
$aa = &$a;
$bb = &$b;
$bb = &$aa;
$bb = 2;
echo $a; //输出2
echo $b; //输出1
?>
从上面例子可以看到,如果给一个引用变量赋予一个新的引用,此时它会先断开和之前引用的映射,所以在这个例子中,$bb被再次赋值后,其实已经断开和$b的映射关系,建立了与$a的映射关系。
5.取消引用
使用unset可以取消$a的引用,但不会影响$b,如果需要取消所有的引用,可以用$a = null ,这时引用计数为0,就会触发zend的回收机制。
<?php
$a = 1;
$b = &$a;
unset($a);
echo $a; //输出null
echo $b; //输出1
?>
从上面例子可以看到,如果给一个引用变量赋予一个新的引用,此时它会先断开和之前引用的映射,所以在这个例子中,$bb被再次赋值后,其实已经断开和$b的映射关系,建立了与$a的映射关系。
5.对象引用
PHP中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP提供了clone方法。
<?php
class Test{
public $var;
}
$a = new Test();
$a->var = 1;
$b = $a;
echo $b->var; //输出1
$c = clone $a;
$c->var = null;
echo $a->var //输出1
?>
关于对象的引用,还涉及到了深拷贝和浅拷贝。