zoukankan      html  css  js  c++  java
  • 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 ,这样就可以了。

  • 相关阅读:
    legend3---图片裁剪实例代码
    JPG 和 JPEG 格式有什么区别
    jpg与png图片的优缺点
    心得体悟帖---200320(legend3它的真实意义,在于资质提升,一举多得)
    心得体悟帖---200320(觉得录课录不下去了,可以去招聘市场找找激励,这个真的特别有效)
    心得体悟帖---200320(我必不甘于人之下,所以还是得自己干,自己好好录课)
    ES6参考---Promise对象
    范仁义js课程---70、sort方法
    JS实现异步编程的4种方法(总结)
    JS执行机制详解
  • 原文地址:https://www.cnblogs.com/zqifa/p/php-27.html
Copyright © 2011-2022 走看看