php中switch语句执行的过程
2016-05-11 00:00
411 查看
摘要: switch语句大家都很熟悉,各种书籍都会提及到它,但是大多数书中只给出了它的大概执行流程,有一些特殊的情况和具体的细节在书中并没有详细介绍。最近重看php语法的时候,实验了一些特殊的情况,虽然在实际的编程中不会这样写(这样写代码应该会被骂死),但是可以加深对switch语句的理解。
switch语句大家都很熟悉,各种书籍都会提及到它,但是大多数书中只给出了它的大概执行流程,有一些特殊的情况和具体的细节在书中并没有详细介绍。最近重看php语法的时候,实验了一些特殊的情况,虽然在实际的编程中不会这样写(这样写代码应该会被骂死),但是可以加深对switch语句的理解。
声明: 这里的例子只是在php中实验过,其他语言的结果不一定和这里的一样。
w3school上对switch的工作原理解释如下:
对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
如果没有 case 为真,则使用 default 语句
工作原理解释 出自:http://www.w3school.com.cn/php/php_switch.asp
细节1:
当把default语句放在case语句中间,而不是所有case语句的最后时,比较到default语句后,会不会直接执行default语句,还是跳过default语句比较接下来的case的值?例子如下:
$num = 2;
switch($num)
{
case 1:
echo 1;
break;
default:
echo 0;
break;
case 2:
echo 2;
break;
}
本例的结果是输出 2 ,说明表达式的值与case的值进行比较的阶段,会自动跳过default语句。
具体的流程是:$num与1比较,结果为false;然后$num与2比较,结果为true,执行echo 2和break这两条语句。
细节2:
由细节1可以知道比较case值的时候会跳过default语句,那比较某个case值后结果为true,但是该case语句中没有break语句的时候(原理上是会一直执行,直到遇到break或者switch语句结束),会不会也跳过default语句呢?例子如下:
$num = 1;
switch($num)
{
case 1:
echo 1;
default:
echo 0;
case 2:
echo 2;
}
本例的结果是输出 102 ,说明这种情况下,default语句不会被跳过。
具体的流程是:$num与1比较,结果为true。执行echo 1,该case语句中没有break语句,所以继续执行下去,执行default中的echo 0,default中也没有break语句,所以继续执行case 2中的echo 2 。
由这个例子外面也可以知道,当default语句在ca
3ff0
se语句中间,default语句中没有break语句的时候,也会继续执行接下来的语句(echo 2)。
细节3:
当有两个以上的case的值一样时,会执行哪一个case语句,还是会报错?例子如下:
$num = 1;
switch($num)
{
case 1+0:
echo "1+0";
break;
default:
echo 0;
break;
case 1:
echo 1;
break;
case 0+1:
echo "0+1";
break;
}
本例的结果是输出 1+0,说明有两个以上的case的值一样时,不会报错,而且会按照正常的方法进行一个一个的比较,在最前面的case语句会被最先匹配,所以会被执行。
具体的流程是:$num与1+0比较,结果为true。执行echo "1+0"和break语句。
switch语句大家都很熟悉,各种书籍都会提及到它,但是大多数书中只给出了它的大概执行流程,有一些特殊的情况和具体的细节在书中并没有详细介绍。最近重看php语法的时候,实验了一些特殊的情况,虽然在实际的编程中不会这样写(这样写代码应该会被骂死),但是可以加深对switch语句的理解。
声明: 这里的例子只是在php中实验过,其他语言的结果不一定和这里的一样。
w3school上对switch的工作原理解释如下:
对表达式(通常是变量)进行一次计算
把表达式的值与结构中 case 的值进行比较
如果存在匹配,则执行与 case 关联的代码
代码执行后,break 语句阻止代码跳入下一个 case 中继续执行
如果没有 case 为真,则使用 default 语句
工作原理解释 出自:http://www.w3school.com.cn/php/php_switch.asp
细节1:
当把default语句放在case语句中间,而不是所有case语句的最后时,比较到default语句后,会不会直接执行default语句,还是跳过default语句比较接下来的case的值?例子如下:
$num = 2;
switch($num)
{
case 1:
echo 1;
break;
default:
echo 0;
break;
case 2:
echo 2;
break;
}
本例的结果是输出 2 ,说明表达式的值与case的值进行比较的阶段,会自动跳过default语句。
具体的流程是:$num与1比较,结果为false;然后$num与2比较,结果为true,执行echo 2和break这两条语句。
细节2:
由细节1可以知道比较case值的时候会跳过default语句,那比较某个case值后结果为true,但是该case语句中没有break语句的时候(原理上是会一直执行,直到遇到break或者switch语句结束),会不会也跳过default语句呢?例子如下:
$num = 1;
switch($num)
{
case 1:
echo 1;
default:
echo 0;
case 2:
echo 2;
}
本例的结果是输出 102 ,说明这种情况下,default语句不会被跳过。
具体的流程是:$num与1比较,结果为true。执行echo 1,该case语句中没有break语句,所以继续执行下去,执行default中的echo 0,default中也没有break语句,所以继续执行case 2中的echo 2 。
由这个例子外面也可以知道,当default语句在ca
3ff0
se语句中间,default语句中没有break语句的时候,也会继续执行接下来的语句(echo 2)。
细节3:
当有两个以上的case的值一样时,会执行哪一个case语句,还是会报错?例子如下:
$num = 1;
switch($num)
{
case 1+0:
echo "1+0";
break;
default:
echo 0;
break;
case 1:
echo 1;
break;
case 0+1:
echo "0+1";
break;
}
本例的结果是输出 1+0,说明有两个以上的case的值一样时,不会报错,而且会按照正常的方法进行一个一个的比较,在最前面的case语句会被最先匹配,所以会被执行。
具体的流程是:$num与1+0比较,结果为true。执行echo "1+0"和break语句。
相关文章推荐
- PHP8新特性之match表达式
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- 三个有用的 Switch 命令
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- 简单好用的PHP分页类