0

看看下面的代码:

 <?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 和未设置有什么区别?

4

7 回答 7

7

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

用于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    |
-------------------------------------------------------------------------------
于 2012-10-12T13:10:15.657 回答
4

正如有人从unset()中所说的那样

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

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

于 2012-10-12T12:55:49.483 回答
2

FORM PHP DOC isset

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

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

未设置

unset() 销毁指定的变量。

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

于 2012-10-12T12:55:13.537 回答
2

您正在使用isset(). 根据手册isset()检查是否设置了变量而不是 NULL。因此,您不能使用isset()来区分未设置的变量和为 NULL 的变量。

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

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

如果您想深入研究,这对垃圾收集和其他事情有影响。

于 2012-10-12T12:58:38.590 回答
1

几乎已经回答了所有问题,但我只想添加这个示例:

$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
*/

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

于 2012-10-12T13:04:44.520 回答
0

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

$a = NULL;

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

虽然unset()喜欢

unset($a);

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

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

但是,如果您取消设置的变量是别名,则仅删除别名,不会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

于 2012-10-12T14:54:58.650 回答
0

将变量设置为 NULL 意味着将值 NULL 分配给变量,就像变量设置为一个值一样,并且 value 是特殊值 NULL。

而 unset() 会破坏指定的变量。函数内部 unset() 的行为可能因您尝试销毁的变量类型而异。

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

于 2016-10-21T08:53:42.580 回答