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 ,这样就可以了。

原文地址:https://www.cnblogs.com/zqifa/p/php-27.html