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已经很好地解释过的输出;)