4

可能的重复:
使用 PHP 释放内存有什么好处:unset() 或 $var = null

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

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

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

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

4

3 回答 3

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

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

添加 php 的 GC。

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

所以 if $a = $b = array(/*a very large array*/);, unset only$a或 only$b不会释放大数组的内存。

unset($a);$a = null或分配另一个值$a将全部减1,但只有减为0refcount时才会释放内存。refcount

于 2012-08-02T02:17:45.710 回答
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变量。IE:

<?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) }
于 2012-08-02T02:26:25.133 回答
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
于 2012-08-02T02:26:05.267 回答