首先说明,这不是一个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以上

<?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"的更多相关文章

  1. Android Studio快捷键switch case 轻松转换为if else

    Android Studio快捷键switch case 轻松转换为if else 今天碰到的问题,没有找到资料,后面找到了方法,这个记下来,转载请注明出处:http://www.cnblogs.co ...

  2. java中的switch case

    switch-case语句格式如下 switch(变量){ case 变量值1: //; break; case 变量值2: //...; break; ... case default: //... ...

  3. 为什么说在使用多条件判断时switch case语句比if语句效率高?

    在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...

  4. c语言基础表达式, 关系运算符, 逻辑运算符, 位运算符, 数据的取值范围, 分支结构(if...else, switch...case)

    1.表达式: 表达式的判断是有无结果(值), 最简单的表达式是一个常量或变量, 如:12, a, 3 + 1, a + b, a + 5 都是表达式 2.BOOL(布尔)数据类型: c语言中除了基本数 ...

  5. 运算符 与 分支语句:if ,else if,else;switch case

    分支语句: if        else if       else      :    switch          case --如何使用 if  else if  else: Console. ...

  6. switch...case和if...else if的判断应用

    判断成绩所属等级的 两种方法 1...      switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...

  7. go语言选择语句 switch case

    根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...

  8. 简谈switch case

    工作中从buff里截取了一个字符串,然后和配置文件中的字符串名字对比 ,如果一样,处理,不一样,elseif 再判断,再处理! switch(){case : case :...... }先说语法,再 ...

  9. 用Dictionary替换switch case

    用switch case处理一个很长的判断,例如56个民族01代表汉族,02代表藏族,03代表壮族...,当传入数字想获取民族名称时就得写56个case,当传入民族获取背后的数字时,又得再写56个ca ...

随机推荐

  1. 关于GET POST

    先说相同点,只有了解了相同点之后才能理解为什么会发生混淆.两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是var_1=value_1&var_2=value_2&... ...

  2. TED #02#

    Amanda Palmer: The art of asking 1. I think people have been obsessed with the wrong question, which ...

  3. Centos7.5 升级python3.6

    Centos7.5自带为/usr/bin/python2.7,需升级到python3.6,安装非常简单,直接通过yum. #centos7 pythonyum install epel-release ...

  4. Python3.x:免费代理ip的批量获取并入库

    Python3.x:免费代理ip的批量获取并入库 一.简介 网络爬虫的世界,向来都是一场精彩的攻防战.现在许多网站的反爬虫机制在不断的完善,其中最令人头疼的,莫过于直接封锁你的ip.但是道高一尺魔高一 ...

  5. 初识PHP(一)基础语法

    一直准备学习PHP,结果前一段时间总是有事情,耽误了一阵子.现在赶快迎头赶上! 这个系列只是谈谈我对于PHP的一些看法,不是教程性质的.另外我是小白,只是写写随笔,大神求轻拍.本人学习过c .java ...

  6. Git提交撤销

    场景:本地修改代码后,执行commit提交,但此时想撤销该提交. 执行命令: git reflog   查看所有commit历史 git reset --hard commitid     将当前远程 ...

  7. windows10如何安装cpu版本tensorflow

    1.获取anaconda https://repo.continuum.io/archive/Anaconda3-2018.12-Windows-x86_64.exe (这个版本内置python3.7 ...

  8. [nowcoder]contest/172/C保护

    C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为首都.国家有m支军队,分别守卫一条路径的城市.具体来说,对于军队i,他守卫的城市区域可以由一对二元组(xi,yi) ...

  9. When should I use OWIN Katana?

    When should I use OWIN Katana? 解答1 In asp.net WebApi v2, the OWIN pipeline becomes the default. It i ...

  10. ListBox的虚拟可视化技术

    在ListBox中承载大量的数据项时,可采用虚拟可视化技术来提高控件显示数据的性能.如下代码: <ListBox.ItemsPanel>                    <It ...