php switch case的"bug"

本文解析了PHP中switch语句的一个常见陷阱,当条件表达式的值为0时导致的非预期行为,并提供了一种修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

作者:zqifa

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z_qifa

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值