我意识到第二个方法避免了函数调用的开销( update ,实际上是一种语言构造),但是知道一个方法是否比另一个更好会很有趣。我一直在使用unset()大多数代码,但是最近我浏览了一些可以从网上找到的可$var = null代替的类。
unset()
$var = null
有没有首选的,这是什么原因?
在2009年未设置的手册页中提到过:
unset()确实按照其名称所说-取消设置变量。它不会强制立即释放内存。PHP的垃圾收集器将在其认为合适的情况下进行此操作- 出于故意,因为无论如何都不需要这些CPU周期,或者直到脚本耗尽内存之前(无论哪种情况先发生)。 如果这样做,$whatever = null;则将重写变量的数据。您可能会更快地释放/缩小内存,但可能会从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。
unset()确实按照其名称所说-取消设置变量。它不会强制立即释放内存。PHP的垃圾收集器将在其认为合适的情况下进行此操作- 出于故意,因为无论如何都不需要这些CPU周期,或者直到脚本耗尽内存之前(无论哪种情况先发生)。
如果这样做,$whatever = null;则将重写变量的数据。您可能会更快地释放/缩小内存,但可能会从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。
$whatever = null;
(自2013年以来,该unset手册页不再包含该部分)
unset
请注意,直到php5.3为止,如果您有两个循环引用的对象(例如,父子关系),则在父对象上调用unset()不会释放子对象中用于父引用的内存。(当父对象被垃圾回收时,也不会释放内存。)bug33595
问题“ unset和= null之间的差异”详细说明了一些差异:
unset($a)也$a从符号表中删除;例如:
unset($a)
$a
$a = str_repeat('hello world ', 100); unset($a); var_dump($a);
输出:
Notice: Undefined variable: a in xxx NULL
但是何时$a = null使用:
$a = null
$a = str_repeat('hello world ', 100); $a = null; var_dump($a); Outputs: NULL
似乎这$a = null比它的unset()对应对象要快一些:更新符号表条目似乎比删除它快。