[转] 为啥使用PHP的引用和unset
转载自: http://www.sky84.cn/index.php/article_content_id,249.html
先说说为啥要用引用,为啥要用unset。
引用有两个好处,一个是内存省,一个是速度 快。
省内存我想大家都知道吧,比如一个很大的数组$a,如果使用$b = $a;,那么内存使用将多一倍,如果用$b =& $a;,那么几乎没有啥影响。
速度快?可能有人不知道或没有注意,看个例子:
对于数组:$a = array(
0 => array(
0 => array()
),
1 => array(
),
/*……*/
);
代码一:
$a[0][0] = 1;
$a[0][0] = 1;
$a[0][0] = 1;
$a[0][0] = 1;
$a[0][0] = 1;
代码二:
$b =& $a[0];
$b[0] = 1;
$b[0] = 1;
$b[0] = 1;
$b[0] = 1;
$b[0] = 1;
可以的话你可以动手试试,代码二比代码一快,原 因?代码一每次都要去找到$a[0],然后再给$a[0][0]赋值,而代码二,只须找一次$a[0],以后只需对$b[0]赋值,减少数组中查找的次 数。
上面说的是两种常用而且实用的方式,还有其他什么引用呢?可能你经常用却还不知道吧:
function test() {
global $a;
}
在函数内使用global,其实就是在函数内建立一个变量,引用一个全局的变量,上面的代码就等同于:
function test() {
$a =& $GLOBALS['a'];
}
上面就是3种常用的使用引用的地方:
1、对于内容比较大的变量引用到另一个变量;
2、引用一个复杂数组的某一维进行操作;
3、 函数内引用一个全局变量;
既然引用了,那么就涉及到取消引用,也就是unset,因为这篇文章也有说unset,那我们先说什么时候用unset吧,为啥要unset吧。
unset 只有个好处,就是省内存,比如一个很大的数组$a,在以后的代码中不再使用了,那么就使用unset把这个变量销毁掉,节约出内存来给下面的代码使用,当 然我们大部分情况下可能都没有使用unset,因为平时使用的变量都比较小,有没有unset都没啥大问题,实际上php在运行时有内存大小的限 制,php4默认是8M,php5默认128M,至于为啥差这么多。。。我不知道。
有人说不用unset,直接把变量赋值为null就好了,有时 候是对的,有时候是不对的,往后看就知道了。
unset的话就要注意几点,如果变量只是一个引用,那么unset只是销毁这个变量,而原来被引用 的变量不会受到影响,如:
$b =& $a;
unset($b);
上面的代码中$a还是原来值,不会因为$b被 unset了被一起销毁了,另外需要注意:
$b =& $a;
unset($a);
这里是把$a给unset了,但 是$b还是$a被unset前的原值,并不会被一起销毁,也就是说对于被引用的一个内存位置,只要存在一个变量指向它,那么在unset其他指向这个内存 位置的变量的时候都不会被释放。所以要想销毁$a所指向的值就必须:
unset($a, $b);
呃,好像还忘记了,unset除了销毁 变量外,还可以销毁数组的元素,说道销毁数组元素,又要从另外一个方面了解下php的变量,其实php的变量就是引用$GLOBALS数组的第一维,不过 比较特殊的就是它们在unset上是有所区别的:
$a = 1;
unset($GLOBALS['a']);
var_dump($a);
$b = array('a' => 1);
$a =& $b['a'];
unset($b['a']);
var_dump($a);
看 出区别了么?不懂多试几次。
在什么时候不需要unset呢?在函数内:
function test() {
$test = array(/*……*/);
}
这个时候就不需要把变量$test给销毁了,因为函数在执行完后会自动销毁函数内的局部变量。
关 于unset的另一个需要注意的地方,就是对于静态变量,静态变量是个很特别的变量,可以看成是对内存位置的引用,在unset时只是销毁了引用而已:
function test() {
static $test;
$test++;
echo($test . "\r\n");
unset($test);
$test = 2;
echo($test . "\r\n");
}
test();
test();
test();
明 白么?unset并不会销毁变量所指向的内存位置,那怎么把静态变量的内存使用销毁呢?$test = null;!