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

Php $var=null和unset($var)之间的差异,php,Php,可能重复: // $a = NULL; (better I think) $a = 5; $b = & $a; $a = NULL; print "b $b "; // b print(! isset($b)); // 1 ?> 就垃圾收集而言,1在任何情况下都比另一个好吗 编辑: 特别是如果$var是一个非常大的变量,具有许多递归级别和其他对象(对于大型对象的递归清理也是如此) 编辑: 删除此项: 我只能想到一件事,那就是,isset($var)在任何一种情

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

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

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

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

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

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

$var = null;
// it's ok.
if ($var) {}
添加php的GC。

 // $a = NULL; (better I think)
 $a = 5;
 $b = & $a;
 $a = NULL;
 print "b $b "; // b 
 print(! isset($b)); // 1 
 ?>
PHP的垃圾收集基于
zval
refcount
,如果
refcount
变为0,则可以释放
zval

所以如果
$a=$b=array(/*一个非常大的数组*/)
、仅取消设置
$a
或仅取消设置
$b
不会释放大数组的内存


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

取消设置
不会强制立即释放内存,而是将其留给gc<代码>$var=null但是强制立即释放内存

$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
参见示例:
 // $a = NULL; (better I think)
 $a = 5;
 $b = & $a;
 $a = NULL;
 print "b $b "; // b 
 print(! isset($b)); // 1 
 ?>
还值得注意的是,在数组的情况下,unset
会完全销毁变量。i、 e:

 // $a = NULL; (better I think)
 $a = 5;
 $b = & $a;
 $a = NULL;
 print "b $b "; // b 
 print(! isset($b)); // 1 
 ?>
<?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);
?>

这与弱引用有关。变量本身从来没有“超出范围”,它只是在变为无效时需要清理。这是一个奇妙的添加。。。高性能应用非常需要。不需要,但它提供了类似缓存的功能。基本上,加载大量(数百万)对象,并使用弱引用保留最重要的缓存。。。这样,如果变量在某个范围内,它会将引用保留在缓存中。如果没有,可以免费收集。当包含的变量超出范围时,我需要删除引用对象。虽然只有1个线程,但可以有一个非常复杂的对象层次结构。如果您加载图像数据并将其存储在某个类中,那么您实际上只希望缓存它在内存中的时间(其他任何内容都是浪费)。弱引用对于大型应用程序中的大型数据非常重要。我希望我能为解决方案选择多个答案。。。因为我只能选择1,这基本上就是我要找的。对于未来的读者,RiaD和xdazz的答案也为其他用例提供了非常有用的信息。Xdazz在解释GC内部结构时真的做了额外的努力;)该示例如何演示“强制”垃圾收集器?!