php null值在switch语句中混淆

时间:2011-08-17 10:58:14

标签: php

我有以下PHP代码,它给了我一个意想不到的结果:

$foo = NULL;

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

我希望结果不算什么,但它与案例0匹配.php手册说NULL是非值,那么它怎么能等于0?

6 个答案:

答案 0 :(得分:26)

switch语句适用loose comparison,这意味着以下内容被视为等效于0:

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

答案 1 :(得分:3)

beacuse php不是类型严格的语言

$foo = NULL;

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

答案 2 :(得分:0)

PHP正在进行类型强制,弱比较。你需要这样做:

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

答案 3 :(得分:0)

我假设在这里,但可能是switch语句在与$foo比较时强制0的值。为了测试这个假设,为什么不尝试在switch语句上面添加它:

echo $foo == NULL;

这应该在诅咒之前回应1,如果我是正确的......

答案 4 :(得分:0)

这也可以写成

$foo = NULL;

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

答案 5 :(得分:0)

编辑:我的测试不准确,有人向我指出了这一点。如果您有兴趣,请查看评论。

根据我的测试,最重要的答案是不准确的。 似乎 PHP switch 语句将 NULL 视为“小丑”,并将任何情况应用于它。 我尝试了不同的数字和字符串,它们都被解雇了。没有任何迹象表明它应该是 NULL,甚至在 PHP 松散比较中也不行。 所以我的建议是在开头添加 case NULL:,就像在结尾添加 default 一样。

    $foo = NULL;

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