下面的程序是用来计算产品价格范围程序的程序
<?php /** * 计算产品价格范围有bug的程序 * @author http://www.phpff.com **/ $price=0; switch ($price) {case $price <= 100: $price_between = "100以下"; break; case $price <= 300: $price_between = "100-300"; break; case $price <= 500: $price_between = "300-500"; break; case $price <= 800: $price_between = "500-800"; break; case $price < 1000: $price_between = "800-1000"; break; default: $price_between = "1000以上";
}
echo $price_between;//1000以上
?>
问题的原因就是switch case在执行的流程是 switch 位置的条件和 case 位置的条件做比较,再继续执行程序。
a.当$price大于0时,switch位置的条件为“真” true,然后用true 和 case 位置的条件作比较。这时程序是没有问题的,因为只要case位置的条件为true语句就跳出了。
b.当$price等于0时,就需要主要了。这个时候switch位置的条件为“假” false,语句继续执行的时候,只有当 case 位置的条件也为false 程序才会执行 case 冒号位置后的程序。而事实是 case 位置的所有调教都为“真”,所以最终的结果是执行default冒号后的语句。
下面的程序是如何处理这个问题的正确方法。
<?php /** * 计算产品价格范围程序 * @author http://www.phpff.com **/ $price=0; switch (true) { case $price <= 100: $price_between = "100以下"; break; case $price <= 300: $price_between = "100-300"; break; case $price <= 500: $price_between = "300-500"; break; case $price <= 800: $price_between = "500-800"; break; case $price < 1000: $price_between = "800-1000"; break; default: $price_between = "1000以上"; } echo $price_between;//1000以上 ?>
变化是把 switch 位置的值由 $price 改成了 true ,这样问题就解决了。