使用PHP释放内存更好:unset()或$var = null

php
2022-08-30 06:09:32

我意识到第二个避免了函数调用的开销(更新,实际上是一种语言结构),但是知道一个是否比另一个更好会很有趣。我一直在使用我的大部分编码,但我最近查看了一些从网上发现的受人尊敬的类, 这些类使用代替。unset()$var = null

有没有一个首选,理由是什么?


答案 1

在2009年未设置的手册页面中提到了它

unset()正如它的名字所说 - 取消设置变量。它不会强制立即释放内存。PHP的垃圾回收器会在它认为合适的时候这样做 - 故意尽快,因为无论如何都不需要这些CPU周期,或者最晚在脚本耗尽内存之前,无论首先发生什么。

如果你正在这样做,那么你正在重写变量的数据。您可能会更快地释放/收缩内存,但它可能会更快地从真正需要它们的代码中窃取CPU周期,从而导致更长的整体执行时间。$whatever = null;

(自2013年以来,未设置的手册页不再包含该部分)

请注意,在 php5.3 之前,如果在循环引用中有两个对象(例如在父子关系中),则在父对象上调用 unset() 将不会释放子对象中用于父引用的内存。(当父对象被垃圾回收时,也不会释放内存。(错误 33595)


问题“未设置和 = null 之间的区别”详细说明了一些差异:


unset($a)也从符号表中移除;例如:$a

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

输出:

Notice: Undefined variable: a in xxx
NULL

但是,当使用时:$a = null

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

输出:

NULL

这似乎比它的对应物快一点:更新符号表条目似乎比删除它更快。$a = nullunset()


  • 当您尝试使用不存在的 () 变量时,将触发错误,并且变量表达式的值将为 null。(因为,PHP还应该做什么?每个表达式都需要产生一些值。unset
  • 但是,赋值为 null 的变量仍然是一个完全正常的变量。

答案 2

unset实际上不是一个函数,而是一种语言构造。它只不过是一个函数调用,而不是一个 或 一个 .returninclude

除了性能问题之外,使用还可以使代码的意图更加清晰。unset


推荐