PHP 松散比较和 Switch 上的 null

PHP Loose comparison and null on Switch

今天我在我的代码中看到了一个奇怪的错误。 我有一个比较大小写的开关,如果我的变量等于 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 语句上它可以工作但在 switch case 上它不起作用,我不知道为什么.. 可能是 PHP 问题?有人遇到过类似的错误吗?

$sHost 可以为空,因为有时我 运行 脚本带有一个批处理。

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

当然我可以在切换之前执行 if is_null,但我想了解为什么它会这样工作..

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

感谢您以后的回答:)

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

@Leggendario,说得好,上面已修复。

如果 $sHost 等于 null 或 '',那么第一个 switch case 总是 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;
}