我意识到第二种方法避免了函数调用的开销(update,实际上是一种语言构造),但是知道其中一种方法是否比另一种方法更好会很有趣.我的大部分代码都使用unset()
,但最近我查看了几个从网上找到的值得尊敬的类,它们使用$var = null
代替.
有没有首选的,理由是什么?
我意识到第二种方法避免了函数调用的开销(update,实际上是一种语言构造),但是知道其中一种方法是否比另一种方法更好会很有趣.我的大部分代码都使用unset()
,但最近我查看了几个从网上找到的值得尊敬的类,它们使用$var = null
代替.
有没有首选的,理由是什么?
这是在unset manual's page in 2009年前提到的:
unset()
正如它的名字所说的那样-取消设置一个变量.它不强制立即释放内存.PHP的垃圾收集器将在发现合适的意图时立即执行此操作,因为无论如何都不需要这些CPU周期,或者直到脚本耗尽内存之前(无论先发生什么).如果你做的是
$whatever = null;
,那么你就是在重写变量的数据.您可能会更快地释放/收缩内存,但它可能会更快地从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间.
(自2013年以来,这unset
man page个项目不再包括该部分)
注意,直到php5.3.如果有two objects in circular reference,例如在父子关系中,对父对象调用unset()将不会释放子对象中用于父引用的内存.(当父对象被垃圾收集时,内存也不会被释放.)(bug 33595)
问题"difference between unset and = 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 = null
似乎比unset()
快一点:更新符号表条目似乎比删除它要快.
unset
)变量时,将触发一个错误,变量表达式的值将为空.(因为,PHP还应该做什么?每个表达式都需要产生一些值.)