PHP在Switch上松散比较并返回null

时间:2015-06-19 11:18:19

标签: php null switch-statement comparison case

今天我在代码上看到了一个奇怪的错误。 我有一个开关与case进行比较,如果我的变量等于null或''它将始终出现在第一种情况。

我的代码:

$sHost  = filter_input(INPUT_SERVER, 'HTTP_HOST');

switch($sHost){
     // Local
    case strpos($sHost, "dev.localhost") !== false: $this->_sEnv  = 'local';
                                                    break;             
    // Prod
    default:                                        $this->_sEnv = 'production';
                                                    break;
}

在if语句上它是可行的,但在切换案例中它不起作用,我不知道为什么......也许是PHP问题?有没有人有类似的错误?

$ sHost可以为null,因为有时我会用批处理来运行脚本。

if(strpos($sHost, "dev.localhost") !== false){
// Nothing
}
else{
    return false;
}

当然我可以在切换之前做一个if is_null,但我想明白为什么它会像那样工作..

编辑:我忘了说我的开关有5个案例,有一个案例是环境

感谢您将来的回答:)

2 个答案:

答案 0 :(得分:2)

如果$sHost等于null或'',则第一个切换案例始终为true,因为

var_dump($sHost == (strpos($sHost, "dev.localhost") !== false));

是真的。 How switch work。 你可以这样做:

switch(true) {
     // Local
    case strpos($sHost, "dev.localhost") !== false:
        $this->_sEnv  = 'local';
        break;             
    // Prod
    default:
        $this->_sEnv = 'production';
        break;
}

答案 1 :(得分:1)

switch(strpos($sHost, "dev.localhost")){
     // Local
    case -1: $this->_sEnv = 'production';
    break;             
    // Prod
    default: $this->_sEnv  = 'local';
     break;
}

@Leggendario,好点,修正了上面。