代码之家  ›  专栏  ›  技术社区  ›  waiwai933

将变量vs设置为''

  •  8
  • waiwai933  · 技术社区  · 15 年前

    做下列事情是更好的形式吗?如果不是,其中一个比另一个快吗?

    unset($variable);
    

    还是做

    $variable = '';
    
    6 回复  |  直到 15 年前
        1
  •  11
  •   jspcal    15 年前

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

    • unset将从符号表中删除变量,并将内容上的引用计数减少1。之后对变量的引用将触发一个通知(“未定义变量”)。(注意,对象可以通过实现\uuu unset()覆盖其属性上的默认unset行为)。

    • 设置为空字符串将使内容上的引用计数减少1,将内容设置为0长度的字符串,但符号仍将保留在符号表中,并且您仍然可以引用变量。(注意,对象可以通过实现\uuu 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值,这是使用unset var无法完成的……

    所以我要说:

    $var = false; ...
    if ($var !== false) ...
    

    $var = null; ...
    if (!is_null($var)) ...
    

    检查哨兵值比

    unset($var); ...
    if (isset($var)) ...
    
        2
  •  2
  •   Tyler Carter    15 年前

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

    if(isset($test))
    

    因为它仍然是“set”,所以它只是被设置为en空值。

    然而,它将回到

    if(empty($test))
    

    因为它是一个空变量。这取决于你在检查什么。通常人们倾向于检查变量是否是集,而不是它是否是空的。

    所以最好把它完全解除。

    而且,这更容易理解

    unset($test);
    

    比这个

    $test = '';
    

    第一个立即告诉您变量不再被设置。当后者简单地告诉你它被设置为一个空白。当您要向变量中添加内容,并且不希望出现php错误时,通常会使用此选项。

        3
  •  2
  •   Christian C. Salvadó    15 年前

    你在做不同的事情 unset 为了在创建指定变量的上下文中销毁该变量,第二个示例将该变量简单地设置为空字符串。

    如果您关心性能,设置变量为 NULL 也许是个更好的选择,但事实上,两者之间的差别并不明显…

    docs :

    unset()按它的名字做 -取消设置变量。它不会强制立即释放内存。PHP的 垃圾收集器会在 一旦 反正不需要这些CPU周期, 或者像以前一样迟 内存不足,无论发生什么 第一。

    如果你在做$whatever=null; 然后重写变量的 数据。你可能会释放内存/ 收缩得更快,但可能会占用CPU 从真正需要的代码中循环 它们越快,导致 总执行时间。

        4
  •  2
  •   Jon    15 年前

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

    因此,如果空字符串是合法(或sentinel)值,无论您对变量执行什么操作,请继续并将其设置为“”。否则,如果该变量不再有用,则取消设置该变量会使代码意图更清晰。

        5
  •  0
  •   jakecard    15 年前

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

    你是想清理记忆还是什么?如果是的话,不要这样做;php为您管理内存,这样您就可以让它到处乱放,它将自动被清理。

    如果你不想清理内存,那么你需要找出 为什么? 您希望取消设置变量或将其设置为空,然后选择适当的变量。一个很好的检查:假设有人在您的unset/empty之后插入了以下代码行:

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

    然后,稍后:

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

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

        6
  •  0
  •   Don    15 年前

    这里还有另一个问题需要考虑,那就是参考文献。

    如果你有:

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

    那么做你的两个选择是完全不同的。

    $variable = '';
    

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

    unset($variable);
    

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