Jex’s Note

PHP Switch(0)的問題

當switch帶0進去後會發生一些問題,先來看以下的範例:

function result($num)
{
    switch ($num)
    {
        case $num < 60 :
            echo '<60';
            break;
        case $num > 60 :
            echo '>60';
            break;
        default:
            echo "I don't know!";
            break;
    }
}

echo result(0);    // 結果:>60
echo result(1);    // 結果:<60

為什麼!?

答案就在 官方手冊這一頁Loose comparisons with == 這邊,意思是說當帶0進去時它的判斷會是 0 == (0<60),結果就不會是你預期的,因為0在模糊比對裡也就是代表著false

那什麼情況要用if else什麼情況用switch?

當你要比對的是一個值而不是一個判斷句則使用switch就沒有問題 ex :

case 3 :
    echo '這是3';
    break;

如果要比對的是一個判斷句,代入>0的數值不會出問題,但當代入0時就會出問題,這不是php的bug,只能算是使用上的認知錯誤,因為我們以為它的判斷為0 > 60,但實際上是0 == (0>60),所以比對判斷句就使用if else吧!

    case $num > 60 :
        echo '大於60';
    break;

ref: 夯哥

Comments