加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php switch case的"bug"

发布时间:2020-12-13 21:22:11 所属栏目:PHP教程 来源:网络整理
导读:首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。 今天使用switch遇到一个问题,代码如下: ? 1 ? php 2 3 4 $num = 0 ; 5 switch ( $price ) { 6 case $price = 100: 7 $price_between = "100以下" 8 break 9 $price 1000: 10 $price_between =

首先说明,这不是一个bug。应该说是一个比较容易中招的陷阱。


今天使用switch遇到一个问题,代码如下:

?

 1 <?php
 2 
 3 
 4 $num = 0;
 5 switch ($price) {
 6     case $price <= 100:
 7         $price_between = "100以下" 8         break 9     $price < 1000:
10         $price_between = "800-1000"11         12     default:
13         $price_between = "1000以上"14         15 }
16 
17 echo $price_between18 //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冒号后的语句。

下面的程序是如何处理这个问题的正确方法。

?

 3 $price = 0 4 switch (TRUE 5      6          7          8      9         10         11     12         13         14 15 
16 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 ,这样就可以了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读