PHP 5.6.3(xamp,Laravel 5)swith-case构建中的错误?

时间:2015-06-24 13:49:44

标签: 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';
            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);
在调用之后

返回: “$卫生署&GT; = 1” 0.0

???

这是错误的答案,因为它应该返回第一种情况:“$ dH&gt; = 0”。

???

我在https://gist.github.com/Jadzia626/2323023

中找到了这个结构

2 个答案:

答案 0 :(得分:5)

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;
    }
}

现在,如果输出为真,您将检查每个case,这应该适用于您的代码段。

答案 1 :(得分:2)

为什么会发生这种情况:

($dH >= 1.0 && $dH < 2.0)评估为(0.0 >= 1.0 && 0.0 < 2.0),这是错误的。

然后由于PHP松散类型比较模型,它会神奇地转换为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;
    }

换句话说,不要使用像ifs那样的开关,因为它们不是。