回答
他们会做稍微不同的事情:
未设置将删除符号表中的变量,并通过减小对内容的引用计数1.之后对变量的引用将触发通知(“未定义变量”)。 (请注意,通过实现__unset()),对象可以覆盖其属性的默认未设置行为。
设置为空字符串将使内容的引用计数递减1,将内容设置为长度为0的字符串,但符号仍将保留在符号表中,并且仍然可以引用该变量。 (注意,一个对象可以通过实现__set()来覆盖其属性的默认赋值行为。
在较老的php中,当ref计数降到0时,调用析构函数并立即释放内存。在更新的版本中(> = 5.3),php使用缓冲方案,对循环引用具有更好的处理能力(http://www.php.net/manual/en/features.gc.collecting-cycles.php),所以内存可能稍后被释放,但它可能不会被延迟......无论如何,并没有真正引起任何问题,新的算法可以防止某些内存泄漏。
如果变量名不再被使用,unset应该快几个cpu周期(因为不需要创建新的内容)。但如果重新使用变量名称,php将不得不创建一个新的变量和符号表项,所以它可能会变慢!在大多数情况下差异可以忽略不计。
如果您想将该变量标记为无效以供以后检查,可以将其设置为false或null。这比使用isset()进行测试要好,因为变量名中的拼写错误将返回false而没有任何错误...您还可以将false和null值传递给另一个函数,并保留sentinel值,这是无法完成的未设置无功...
,所以我会说:
$var = false; ...
if ($var !== false) ...
或
$var = null; ...
if (!is_null($var)) ...
会比
检查定点值更好3210技术上$test = ''
将返回true,以
if(isset($test))
因为它仍然是“集”,它只是设置为en空值。
它将然而返回true以
if(empty($test))
,因为它是一个空的变量。这取决于你正在检查的内容。通常人们倾向于检查变量是否被设置,而不是如果它是空的。
因此,最好完全取消它。
此外,这是比较容易理解
unset($test);
比这
$test = '';
第一马上告诉您该变量不再设置。后者只是简单地告诉你它被设置为空白。当您要将东西添加到变量并且不希望PHP出错时,这是常用的。
您正在做不同的事情,unset
的目的是销毁指定的变量在您创建的位置上下文中,第二个示例只是将该变量设置为空字符串。
清除一个变量不强制立即释放内存,如果您关心性能,该变量设置为NULL
可能是一个更好的选择,但实际上,差异会不明显......
讨论在docs
:
未设置()不正是它的名字说 - 取消设置的变量。它不强制立即释放内存。 PHP的 垃圾收集器会做它时,它 看到千篇一律 - 尽快意向,作为 反正不需要的CPU周期, 或迟脚本之前将 耗尽内存,无论发生什么, 第一。
如果你正在做$ whatever = null; 然后你正在重写变量的 数据。您可能会获得内存释放更快的速度,但它可能会从真实需要 的代码中窃取CPU 的周期,从而导致整个执行时间更长。
它们有完全不同的含义。前者使变量不存在。后者只是将其值设置为空字符串。说哪一个更“好”并不重要,因为它们是完全不同的东西。
你想清理内存吗?如果是这样,不要; PHP为你管理内存,所以你可以放置它,它会自动清理。
如果你不想清理内存,那么你需要弄清楚为什么你想取消设置变量或将其设置为空,并选择合适的变量。这样做的一个很好的完整性检查:让我们说某人插入下面的代码行后的某个地方你没有设置/空:
if(strcmp($variable, '') == 0) { do_something(); }
再后来:
if(!isset($variable)) { do_something_else(); }
第一个将运行do_something()
如果设置该变量为空字符串。如果您未设置变量,第二个将运行do_something_else()
。如果你的脚本行为正常,你希望运行哪些?
我认为最相关的区别是,取消设置变量表示变量不会被后续代码使用(如果您尝试使用它,也会通过报告E_NOTICE来“强制执行”,因为jspcal表示这是因为它不再在符号表中)。
因此,如果空字符串是一个合法(或标记)值,无论您对变量做什么,请继续并将其设置为“'。否则,如果该变量不再有用,则将其设置为更清晰的代码意图。
在这里还有另一个'gotcha'考虑,参考。
,如果你有:
$a = 'foobar';
$variable =& $a;
然后做或者您的两个选择是完全不同的。
$variable = '';
套既$变量和$一个空字符串,其中作为
unset($variable);
而从符号表中除去$变量除去$ a和$变量之间的参考链路。这确实是取消链接$ a和$变量而不设置$ variable引用别的变量的唯一方法。请注意,例如$ variable = null;不会这样做。
- 1. 取消设置变量
- 2. 取消设置组变量
- 3. 取消设置变量,但不会取消设置
- 4. PHP会话设置为变量并取消设置。
- 5. 设置变量定义VS
- 6. PHP $ _SESSION变量不会取消设置
- 7. 取消设置局部变量
- 8. 如何取消设置多个变量?
- 9. 在bash中取消设置readonly变量
- 10. 会话取消设置每个变量?
- 11. 取消设置参数变量
- 12. 如何取消设置$ _SESSION变量?
- 13. 取消设置php会话变量
- 14. 会话变量未被取消设置
- 15. 如何取消设置全局变量。
- 16. 将jQuery设置类设置为变量
- 17. 设置变量
- 18. 设置变量
- 19. 设置变量
- 20. => vs - >访问/设置类变量
- 21. PDO设置变量vs while循环
- 22. 取消设置所有变量? (不$ $ _SESSION ['']或全局变量)
- 23. 将变量值设置为
- 24. 将值设置为变量
- 25. 设置变量为false
- 26. 将document.body.className设置为变量
- 27. 将变量设置为CGPointMake
- 28. cfhtmlhead重置/取消设置或取消?
- 29. 设置/取消设置下划线TextView
- 30. 设置和取消设置Cookie
我不能相信没有人提到'E_NOTICE' ......我的天哪,任何人仍然无视这个需要用_proper_编译器打头! – Tom 2010-01-11 04:56:48