【问题标题】:What is difference between assigning NULL and unset?分配 NULL 和未设置有什么区别?
【发布时间】:2012-10-03 07:06:00
【问题描述】:

看看下面的代码:

 <?php 
   $a = 20;
   $a= NULL;  //or unset($a)
   if(isset($a))
   {
      print("hi");
   }
   else
   {
       echo "not initiated";
   }
   if(isset($b))  //$b is a variable which is not initialized
   {
       print("hi");
   }
   else
   {
       echo "not initiated";
   }

?>

当应用未设置时,我得到相同的结果:

那么,分配 NULL 和 unset 有什么区别?

【问题讨论】:

标签: php


【解决方案1】:

将变量设置为 NULL 意味着将值 NULL 完全赋给变量,就像变量设置为一个值一样,值是特殊值 NULL。

而 unset() 会破坏指定的变量。 函数内部 unset() 的行为可能会有所不同,具体取决于您尝试销毁的变量类型。

unset() 表示该变量不再设置,它没有值,基本上该变量不再存在。

【讨论】:

    【解决方案2】:

    主要区别在于将变量设置为NULL,例如:

    $a = NULL;
    

    正在分配一个值,这里是NULL 值。

    尽管unset() 喜欢

    unset($a);
    

    正在取消设置变量,这意味着将其从变量表中删除。

    由于未定义的变量在 PHP 中都是 NULL,所以您可能看不出区别。

    但是,如果您取消设置的变量是别名,则仅删除别名,不会将值 NULL 分配给它。

    一个演示:

    <?php                         // 01
                                  // 02
    $a = 1;                       // 03
    $b = &$a;                     // 04
                                  // 05
    $b = NULL;                    // 06
                                  // 07
    var_dump($a);                 // 08
                                  // 09
    unset($b);                    // 10
                                  // 11
    var_dump($a);                 // 12
                                  // 13    
    unset($a);                    // 14
                                  // 15
    var_dump($a);                 // 16
    

    输出:

    NULL
    NULL
    
    Notice: Undefined variable: a in /t.php on line 16
    NULL
    

    http://codepad.org/cC1vRx0W

    【讨论】:

      【解决方案3】:

      正如您在下面看到的,对于标准比较操作,两者的行为几乎相同。

      使用unset() 释放不再使用但由于引用仍在其他地方保留而无法被 GC 释放的大型对象/数组。

      -------------------------------------------------------------------------------
      |   Expression     | gettype()  | empty()  | is_null()  | isset()  | boolean  |
      -------------------------------------------------------------------------------
      | $x = "";         | string     | TRUE     | FALSE      | TRUE     | FALSE    |
      | $x = null        | NULL       | TRUE     | TRUE       | FALSE    | FALSE    |
      | var $x;          | NULL       | TRUE     | TRUE       | FALSE    | FALSE    |
      | $x is undefined  | NULL       | TRUE     | TRUE       | FALSE    | FALSE    |
      -------------------------------------------------------------------------------
      

      【讨论】:

        【解决方案4】:

        您正在使用isset()。根据the manualisset() 检查是否设置了变量而不是 NULL。所以你不能使用isset()来区分一个未设置的变量和一个为NULL的变量。

        将变量设置为 NULL 的确切含义是:将变量设置为一个值,并且该值是特殊值 NULL。

        另一方面,unset() 表示不再设置变量。它没有价值,基本上不存在了。

        如果您想深入了解,这会对垃圾收集和其他事情产生影响。

        【讨论】:

          【解决方案5】:

          几乎所有问题都已得到解答,但我只想添加这个示例:

          $a = 1;
          $b = 2;
          
          if ( $a == true ) echo 'Value'; else echo 'No value';
          if ( $b == true ) echo 'Value'; else echo 'No value';
          
          /*
          Value
          Value
          */
          
          $a = NULL;
          unset( $b );
          
          if ( $a == true ) echo 'Value'; else echo 'No value';
          if ( $b == true ) echo 'Value'; else echo 'No value';
          
          /*
          No value
          
          Notice: Undefined variable: b in C:\test\test.php on line 13
          No value
          */
          

          结果可能很接近,但最后一个会产生通知,因为不再有这样的变量了。

          【讨论】:

            【解决方案6】:

            正如unset()某人所说的那样

            unset() 就像它的名字所说的那样 - 取消设置一个变量。它不是 强制立即释放内存。 PHP 的垃圾收集器会在 它看起来很合适 - 有意尽快,因为不需要这些 CPU 周期 无论如何,或者直到脚本耗尽内存之前, 无论先发生什么。

            如果你正在做 $whatever = null;那么你是 重写变量的数据。您可能会更快地释放/缩小内存, 但它可能会从真正需要它们的代码中窃取 CPU 周期 更快,从而导致更长的整体执行时间。

            【讨论】:

              【解决方案7】:

              FORM PHP DOC isset

              确定变量是否已设置且不为 NULL。

              如果一个变量已经用 unset() 取消设置,它将不再被设置。如果测试已设置为 NULL 的变量,isset() 将返回 FALSE。另请注意,NULL 字节(“\0”)不等同于 PHP NULL 常量。

              未设置

              unset() 销毁指定的变量。

              它是否启动并不重要,因为您使用 isset 它会为启动变量和空值返回 false

              【讨论】:

                猜你喜欢
                • 2014-01-26
                • 2011-02-14
                • 1970-01-01
                • 2012-04-07
                • 2011-04-16
                • 2016-12-23
                • 2011-06-24
                • 1970-01-01
                • 2011-01-26
                相关资源
                最近更新 更多