2010-01-11 86 views

回答

11

他们会做稍微不同的事情:

  • 未设置将删除符号表中的变量,并通过减小对内容的引用计数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
2

技术上$test = ''将返回true,以

if(isset($test)) 

因为它仍然是“集”,它只是设置为en空值。

它将然而返回true以

if(empty($test)) 

,因为它是一个空的变量。这取决于你正在检查的内容。通常人们倾向于检查变量是否被设置,而不是如果它是空的。

因此,最好完全取消它。

此外,这是比较容易理解

unset($test); 

比这

$test = ''; 

第一马上告诉您该变量不再设置。后者只是简单地告诉你它被设置为空白。当您要将东西添加到变量并且不希望PHP出错时,这是常用的。

2

您正在做不同的事情,unset的目的是销毁指定的变量在您创建的位置上下文中,第二个示例只是将该变量设置为空字符串。

清除一个变量不强制立即释放内存,如果您关心性能,该变量设置为NULL可能是一个更好的选择,但实际上,差异会不明显......

讨论在docs

未设置()不正是它的名字说 - 取消设置的变量。它不强制立即释放内存。 PHP的 垃圾收集器会做它时,它 看到千篇一律 - 尽快意向,作为 反正不需要的CPU周期, 或迟脚本之前将 耗尽内存,无论发生什么, 第一。

如果你正在做$ whatever = null; 然后你正在重写变量的 数据。您可能会获得内存释放更快的速度,但它可能会从真实需要 的代码中窃取CPU 的周期,从而导致整个执行时间更长。

0

它们有完全不同的含义。前者使变量不存在。后者只是将其值设置为空字符串。说哪一个更“好”并不重要,因为它们是完全不同的东西。

你想清理内存吗?如果是这样,不要; PHP为你管理内存,所以你可以放置它,它会自动清理。

如果你不想清理内存,那么你需要弄清楚为什么你想取消设置变量或将其设置为空,并选择合适的变量。这样做的一个很好的完整性检查:让我们说某人插入下面的代码行后的某个地方你没有设置/空:

if(strcmp($variable, '') == 0) { do_something(); } 

再后来:

if(!isset($variable)) { do_something_else(); } 

第一个将运行do_something()如果设置该变量为空字符串。如果您未设置变量,第二个将运行do_something_else()。如果你的脚本行为正常,你希望运行哪些?

2

我认为最相关的区别是,取消设置变量表示变量不会被后续代码使用(如果您尝试使用它,也会通过报告E_NOTICE来“强制执行”,因为jspcal表示这是因为它不再在符号表中)。

因此,如果空字符串是一个合法(或标记)值,无论您对变量做什么,请继续并将其设置为“'。否则,如果该变量不再有用,则将其设置为更清晰的代码意图。

+1

我不能相信没有人提到'E_NOTICE' ......我的天哪,任何人仍然无视这个需要用_proper_编译器打头! – Tom 2010-01-11 04:56:48

0

在这里还有另一个'gotcha'考虑,参考。

,如果你有:

$a = 'foobar'; 
$variable =& $a; 

然后做或者您的两个选择是完全不同的。

$variable = ''; 

套既$变量和$一个空字符串,其中作为

unset($variable); 

而从符号表中除去$变量除去$ a和$变量之间的参考链路。这确实是取消链接$ a和$变量而不设置$ variable引用别的变量的唯一方法。请注意,例如$ variable = null;不会这样做。