PHP5.6.3(xamp,Laravel 5)中的Bug,是否使用了case构造?
为什么功能:PHP5.6.3(xamp,Laravel 5)中的Bug,是否使用了case构造?,php,laravel-5,Php,Laravel 5,为什么功能: function wtf($dH) { switch ($dH) { case ($dH >= 0.0 && $dH < 1.0): echo '$dH>=0'; break; case ($dH >= 1.0 && $dH < 2.0): echo '$dH>=1'; b
function wtf($dH)
{
switch ($dH)
{
case ($dH >= 0.0 && $dH < 1.0):
echo '$dH>=0';
break;
case ($dH >= 1.0 && $dH < 2.0):
echo '$dH>=1';
break;
case ($dH >= 2.0 && $dH < 3.0):
echo '$dH>=2';
break;
case ($dH >= 3.0 && $dH < 4.0):
echo '$dH>=3';
break;
case ($dH >= 4.4 && $dH < 5.0):
echo '$dH>=0';
break;
case ($dH >= 5.0 && $dH < 6.0):
echo '$dH>=5';
break;
default:
echo '$dH>=6';
break;
}
}
wtf(0.0);
功能wtf($dH)
{
交换机($dH)
{
案例($dH>=0.0&$dH<1.0):
回音“$dH>=0”;
打破
案例($dH>=1.0&$dH<2.0):
回声'$dH>=1';
打破
案例($dH>=2.0&$dH<3.0):
回声'$dH>=2';
打破
案例($dH>=3.0&$dH<4.0):
回声'$dH>=3';
打破
案例($dH>=4.4&$dH<5.0):
回音“$dH>=0”;
打破
案例($dH>=5.0&$dH<6.0):
回声'$dH>=5';
打破
违约:
回声'$dH>=6';
打破
}
}
wtf(0.0);
调用后返回:
“$dH>=1”
0.0
这是错误的答案,因为它应该返回第一个案例:“$dH>=0”
我在:中发现了这种结构,switch语句与多个if语句相同。
但是您不需要重新键入if语句,您在这里所做的就是这样 您有两种选择:
-或者你检查一个bool
-或者你用if写所有的东西 因为您已经有了一个开关,所以我选择此代码段中的第一个:
private function wtf($dH)
{
switch (true)
{
case ($dH >= 0.0 && $dH < 1.0):
dd('$dH>=0', $dH);
break;
case ($dH >= 1.0 && $dH < 2.0):
dd('$dH>=1', $dH);
break;
case ($dH >= 2.0 && $dH < 3.0):
dd('$dH>=2', $dH);
break;
case ($dH >= 3.0 && $dH < 4.0):
dd('$dH>=3', $dH);
break;
case ($dH >= 4.0 && $dH < 5.0):
dd('$dH>=4', $dH);
break;
case ($dH >= 5.0 && $dH < 6.0):
dd('$dH>=5', $dH);
break;
default:
dd('$dH>=6', $dH);
break;
}
}
专用功能wtf($dH)
{
开关(真)
{
案例($dH>=0.0&$dH<1.0):
dd('$dH>=0',$dH);
打破
案例($dH>=1.0&$dH<2.0):
dd('$dH>=1',$dH);
打破
案例($dH>=2.0&$dH<3.0):
dd('$dH>=2',$dH);
打破
案例($dH>=3.0&$dH<4.0):
dd('$dH>=3',$dH);
打破
案例($dH>=4.0&$dH<5.0):
dd('$dH>=4',$dH);
打破
案例($dH>=5.0&$dH<6.0):
dd('$dH>=5',$dH);
打破
违约:
dd('$dH>=6',$dH);
打破
}
}
现在,您将在每个案例中检查输出是否为真,这应该适用于您的代码片段。为什么会发生这种情况:
($dH>=1.0&&$dH<2.0)
的计算结果为(0.0>=1.0&&0.0<2.0)
,为false
然后,由于PHPs松散类型比较模型,它被神奇地转换为0
您的开关现在看起来如下所示:
switch (0)
{
case 1 /* 0.0 >= 0.0 && 0.0 < 1.0 === true */:
dd('$dH>=0', $dH);
break;
case 0:
dd('$dH>=1', $dH);
break;
case 0:
dd('$dH>=2', $dH);
break;
case 0:
dd('$dH>=3', $dH);
break;
case 0:
dd('$dH>=4', $dH);
break;
case 0:
dd('$dH>=5', $dH);
break;
default:
dd('$dH>=6', $dH);
break;
}
开关(0)
{
案例1/*0.0>=0.0&&0.0<1.0===true*/:
dd('$dH>=0',$dH);
打破
案例0:
dd('$dH>=1',$dH);
打破
案例0:
dd('$dH>=2',$dH);
打破
案例0:
dd('$dH>=3',$dH);
打破
案例0:
dd('$dH>=4',$dH);
打破
案例0:
dd('$dH>=5',$dH);
打破
违约:
dd('$dH>=6',$dH);
打破
}
换句话说,不要像ifs那样使用开关,因为它们不是。发布你的全部代码我忘了写我使用的是Laravel 5(以及echo调试指令“dd”),你可以在100+php版本中运行你的代码:这是因为开关语句不是那样工作的。用开关($dH)
替换开关(TRUE)
而且它是有效的。几乎:第一种情况是1,因为这句话是正确的。因为$dH为0,所以将采用第二种情况。在这里,我们得到了OP已经很好地解释过的输出;)