将变量与设置取消设置为''

时间:2010-01-11 04:11:57

标签: php variables unset

执行以下操作之一是否更好?如果不是,那么其中一个比另一个更快吗?

unset($variable);

或做

$variable = '';

6 个答案:

答案 0 :(得分:11)

他们会做一些不同的事情:

  • unset将从符号表中删除该变量,并将内容上的引用计数减1.对该变量的引用将触发通知(“未定义变量”)。 (注意,对象可以通过实现__unset()来覆盖其属性的默认取消设置行为。

  • 设置为空字符串会将内容的引用计数减1,将内容设置为0长度的字符串,但符号仍将保留在符号表中,您仍然可以引用该变量。 (注意,对象可以通过实现__set()来覆盖其属性的默认赋值行为。

在较旧的php中,当ref count降为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)) ...

比检查哨兵值更好

unset($var); ...
if (isset($var)) ...

答案 1 :(得分:2)

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

if(isset($test))

因为它仍然是'set',所以它只是设置为空值。

然而它将返回

if(empty($test))

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

所以最好完全取消它。

此外,这更容易理解

unset($test);

比这个

$test = '';

第一个立即告诉您变量不再设置。后者只是告诉你它被设置为一个空格。当您要向变量添加内容并且不希望PHP错误时,通常会使用此方法。

答案 2 :(得分:2)

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

取消设置变量不会强制立即释放内存,如果您担心性能,将变量设置为NULL可能是更好的选择,但实际上,差异不会明显......

docs

中讨论
  

unset()正如它的名字所说的那样    - 取消设置变量。它不会强制立即释放内存。 PHP的   垃圾收集器会在它做的时候做   尽快看到拟合 - 意图   无论如何都不需要那些CPU周期,   或者直到剧本之前   无论发生什么,都会耗尽内存   第一

     

如果你正在做$ whatever = null;   然后你正在重写变量   数据。你可能会释​​放内存/   缩小速度,但它可能会窃取CPU   从真正需要的代码循环   它们越早,导致时间越长   总体执行时间。

答案 3 :(得分:2)

我认为最相关的区别在于,取消设置变量会传达后续代码不会使用该变量(如果您尝试使用它,它也会通过报告E_NOTICE来强制执行此操作,因为jspcal说这是因为它不是在符号表中了。)

因此,如果空字符串是您对变量所做的任何合法(或哨兵)值,请继续并将其设置为''。否则,如果变量不再有用,则取消设置会使代码意图更清晰。

答案 4 :(得分:0)

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

您是在尝试清理内存还是什么?如果是这样,不要; PHP为您管理内存,因此您可以将其留在那里并自动清理它。

如果您没有尝试清理内存,那么您需要找出为什么要取消设置变量或将其设置为空,并选择合适的变量。一个很好的理智检查:让我们说有人在你的unset / empty之后在某处插入了以下代码行:

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

然后,后来:

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

如果将变量设置为空字符串,则第一个将运行do_something()。如果取消设置变量,第二个将运行do_something_else()。如果您的脚本运行正常,您希望运行以下哪一项?

答案 5 :(得分:0)

这里还有另外一个'陷阱',参考。

如果你有:

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

那么做两种选择中的任何一种都是完全不同的。

$variable = '';

将$ variable和$ a设置为空字符串,其中为

unset($variable);

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