switch语句中的php空值混淆

switch语句中的php空值混淆,php,Php,我有以下php代码,它给了我一个意外的结果: $foo = NULL; switch($foo) { case 0: print "What?!"; } 我希望结果为零,但它符合案例0。php手册说NULL是非值,那么它怎么能等于0呢?php正在进行类型强制的弱比较。您将需要执行以下操作: $foo = NULL; if ($foo === 0) print "WTF!!!"; 因为php不是类型严格的语言 $foo = NULL; if( isset(

我有以下php代码,它给了我一个意外的结果:

$foo = NULL;

switch($foo)
{
    case 0:
        print "What?!";
}

我希望结果为零,但它符合案例0。php手册说NULL是非值,那么它怎么能等于0呢?

php正在进行类型强制的弱比较。您将需要执行以下操作:

$foo = NULL;
if ($foo === 0)
    print "WTF!!!";

因为php不是类型严格的语言

$foo = NULL;

if( isset( $foo ) ) {
    switch( $foo ) {
        case 0:
            print "WTF!!!";
    }
}

我在这里假设,
switch
语句在与
0
进行比较时强制执行
$foo
的值。为了验证这一假设,为什么不尝试在switch语句上方添加以下内容:

echo $foo == NULL;

如果我是正确的,这应该在诅咒之前回显1。
开关
语句适用,这意味着以下内容被视为等同于0:

false
0
"0"
NULL
"any string"
""

这也可以写成

$foo = NULL;

switch( true )
{
    case ( 0 === $foo ):
        print "What?!";
    default:
        print "Default?!";
}

阅读上的注释,您将看到松散比较和switch语句的潜在问题打印
bool(真)
;-)我花了一两秒钟才意识到为什么if语句中会出现这种情况。此时,在比较中使用
if
,在默认情况下使用
else
,会更快;D