$ var = null和unset($ var)之间的差异

时间:2012-08-02 02:08:56

标签: php

  

可能重复:
  What's better at freeing memory with PHP: unset() or $var = null

就垃圾收集而言,在任何情况下都比另一个更好?

编辑: 特别是如果$var是一个非常大的变量,具有很多级别的递归和其他对象(这与递归清理大对象有关)

编辑: 删除了这个: 我只能想到一件事,那就是isset($var)在任何一种情况下都会有不同的反应。

因为显然我错了......他们都反应相同。

3 个答案:

答案 0 :(得分:4)

unset($var);
// You will get Undefined variable Notice.
if ($var) {}

$var = null;
// it's ok.
if ($var) {}

添加了PHP的GC。

PHP的垃圾收集基于refcount的{​​{1}},如果zval变为0,则refcount可以被释放。

因此,如果zval,则仅设置$a = $b = array(/*a very large array*/);或仅设置$a将不会释放大型数组的内存。

$bunset($a);或将另一个值分配给$a = null都会让$a减少1,但只有{{1}时才会释放内存减少到0。

答案 1 :(得分:3)

unset不会强制立即释放内存,而是将其留给gc。 $var = null;然而强制立即释放内存。

参见示例      

 // $a = NULL; (better I think)
 $a = 5;
 $b = & $a;
 $a = NULL;
 print "b $b "; // b 
 print(! isset($b)); // 1 
 ?>

值得注意的是,在数组的 情况下 取消设置 destroys 变量完全。即:

<?php
$ar = array(1,2,3,4);
var_dump($ar);
echo "<br />";

unset($ar[2]);
var_dump($ar);
echo "<br />";

$ar[1] = null;
var_dump($ar);
?>

返回输出:

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } 
array(3) { [0]=> int(1) [1]=> NULL [3]=> int(4) }

答案 2 :(得分:2)

$a = 5;
$b = &$a;
unset($b); //just say $b should not pointer to any var
print $a; // 5


$a = 5;
$b = &$a;
$b = null;
print $a; // nothing, because $a = null