php switch case的"bug"
2017-02-28 17:52
423 查看
首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。
今天使用switch遇到一个问题,代码如下:
<?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冒号后的语句。
下面的程序是如何处理这个问题的正确方法。
<?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 ,这样就可以了。
今天使用switch遇到一个问题,代码如下:
<?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以上
<?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冒号后的语句。
下面的程序是如何处理这个问题的正确方法。
<?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以下
<?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 ,这样就可以了。
相关文章推荐
- php switch case的"bug"
- Lua里的"switch-case"语句
- #define宏定义形式的"函数"导致的bug
- python 中的"switch"用法
- 2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ " \’ ' ' \‘ " " \" '' \ " " 使用
- 在线更新dede程序后 网站出现错误 DedeCMS Error:Tag disabled:"php" more...!
- 基于HTTP长连接的"服务器推"技术的php 简易聊天室
- [php5.2.4] explode函数不能按照"\r\n"切割字符串
- php条件语句(2)switch...case语句
- 客户端连不上服务端的"bug"定位过程
- php 正则表达式 将形如 "天," ,"安", "门" 转化为"天、安、门", (仅匹配汉字)
- php从头开始——' '和" "的区别
- PHP中的""、0、null和==、===
- php环境变化引起的"syntax error unexpected $end"
- "php.exe"' 不是内部或外部命令,也不是可运行的程序
- PHP "完美"的防XSS 防SQL注入的代码 喷
- PHP "十二五" 简易 BLOG 代码- 未测试- 07
- 关于PHP 的strtotime("2016.01.26")不输出问题bug查找
- PHP出现"Cannot modify header information"警告的解决方法
- php环境引起的"syntax error unexpected $end"