zqifa的博客

我不管,反正我最萌~

php switch case的

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

作者:zqifa

出处:https://www.l1mn.com

原文地址:https://www.l1mn.com/p/kjqpo4.html

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

分类:phpbug
标签:phpbug

公告

昵称:zqifa

站龄: 4年2个月

博客持续完善ing,敬请期待...

打滚求打赏(๑ ̄ ̫  ̄๑)

此处弱弱求打赏~~万一有好心人呢~~

支付宝酱

支付宝赞助

微信酱

微信赞助

随笔分类

php(110)

linux(63)

python(44)

web前端(39)

js(35)

服务器(33)

mysql(30)

html(24)

docker(23)

windows(22)

centos(22)

django(20)

前端设计(18)

git(16)

常用软件(14)

数据库(14)

算法(14)

字符编码(13)

编程进阶(13)

笔记(12)

更多

我的标签

php(106)

linux(47)

python(45)

js(34)

mysql(30)

centos(28)

web前端(23)

docker(22)

windows(22)

django(20)

更多

相册

Copyright © zqifa 联系方式:z___qf@163.com