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


Differences between $var = null and unset($var)

可能重复:
什么';s更擅长用PHP释放内存:unset()或$var=null

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

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

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

因为显然我错了。。。他们的反应都一样。

unset($var);
// You will get Undefined variable Notice.
if ($var) {}
$var = null;
// it's ok.
if ($var) {}

添加php的GC

PHP的垃圾回收基于zvalrefcount,如果refcount变为0,则可以释放zval

因此,如果$a = $b = array(/*a very large array*/);,则仅取消设置$a或仅取消设置$b不会释放大阵列的内存。

unset($a);$a = null或为$a分配另一个值都会使refcount减少1,但只有当refcount减少到0时,内存才会被释放。

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) }
$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