首先说明,这不是一个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 ,这样就可以了。