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;
}
今天我在我的代码中看到了一个奇怪的错误。 我有一个比较大小写的开关,如果我的变量等于 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;
}