• php switch case的"bug"


    首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。


    今天使用switch遇到一个问题,代码如下:

     1 <?php
     2 
     3 
     4 $num = 0;
     5 switch ($price) {
     6     case $price <= 100:
     7         $price_between = "100以下";
     8         break;
     9     case $price < 1000:
    10         $price_between = "800-1000";
    11         break;
    12     default:
    13         $price_between = "1000以上";
    14         break;
    15 }
    16 
    17 echo $price_between;
    18 //1000以上

    <?php

    $num = 0;
    switch ($price) {
    case $price <= 100:
    $price_between = "100以下";
    break;
    case $price < 1000:
    $price_between = "800-1000";
    break;
    default:
    $price_between = "1000以上";
    break;
    }

    echo $price_between;
    //1000以上

    当$price等于0时最终的结果不是预期的"100以下",而是"1000以上"。

    问题的原因就是switch case在执行的流程是 switch 位置的条件和 case 位置的条件做比较,再继续执行程序。

    a.当$price大于0时,switch位置的条件为“真” true,然后用true 和 case 位置的条件作比较。这时程序是没有问题的,因为只要case位置的条件为true语句就跳出了。

    b.当$price等于0时,就需要注意了。这个时候switch位置的条件为“假” false,语句继续执行的时候,只有当 case 位置的条件也为false 程序才会执行 case 冒号位置后的程序。而事实是 case 位置的所有调教都为“真”,所以最终的结果是执行default冒号后的语句。

    下面的程序是如何处理这个问题的正确方法。

     1 <?php
     2 
     3 $price = 0;
     4 switch (TRUE) {
     5     case $price <= 100:
     6         $price_between = "100以下";
     7         break;
     8     case $price < 1000:
     9         $price_between = "800-1000";
    10         break;
    11     default:
    12         $price_between = "1000以上";
    13         break;
    14 }
    15 
    16 echo $price_between;
    17 //100以下

    <?php

    $price = 0;
    switch (TRUE) {
    case $price <= 100:
    $price_between = "100以下";
    break;
    case $price < 1000:
    $price_between = "800-1000";
    break;
    default:
    $price_between = "1000以上";
    break;
    }

    echo $price_between;
    //100以下

    把 switch 位置的值由 $price 改成了 true ,这样就可以了。

  • 相关阅读:
    (DP+二分查找) leetcode 300. Longest Increasing Subsequence, 673. Number of Longest Increasing Subsequence
    linux
    电脑突然找不到wifi 的解决方法
    (字典序) leetcode 316. Remove Duplicate letters
    vector insert()
    randrange
    blur、medianBlur、GaussianBlur
    clip
    choice
    randint
  • 原文地址:https://www.cnblogs.com/zqifa/p/php-27.html
Copyright © 2020-2023  润新知