PHP的switch判断语句的“高级”用法详解


Posted in PHP onOctober 01, 2014

只所以称为“高级”用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实还是它的基础用法!

switch 语句和具有同样表达式的一系列的 IF 语句相似。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。

注意: 注意和其它语言不同,continue 语句作用到 switch 上的作用类似于 break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一个轮回,用 continue 2。

下面两个例子使用两种不同方法实现同样的事,一个用一系列的 if 语句,另一个用 switch 语句:

Example #1 switch 结构

<?php

if ($i == 0)

{

 echo "i equals 0";

}

elseif ($i == 1)

{

 echo "i equals 1";

}

elseif ($i == 2)

{

 echo "i equals 2";

}
switch ($i)

{

 case 0:

  echo "i equals 0";

  break;

 case 1:

  echo "i equals 1";

  break;

 case 2:

  echo "i equals 2";

  break;

}

?>

Example #2 switch 结构可以用字符串

<?php

switch ($i)

{

 case "apple":

  echo "i is apple";

  break;

 case "bar":

  echo "i is bar";

  break;

 case "cake":

  echo "i is cake";

  break;

}

?>

重点:(这就是我先前一直没掌握的地方!)

为避免错误,理解 switch 是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束(如 return 语句)或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。例如:

<?php

switch ($i)

{

 case 0:

  echo "i equals 0";

 case 1:

  echo "i equals 1";

 case 2:

  echo "i equals 2";

}

?>

特别说明:这里如果 $i 等于 3,PHP不会执行任何echo语句!但是,如果 $i 等于 0,PHP 将执行所有的 echo 语句!如果 $i 等于 1,PHP 将执行后面两条 echo 语句。只有当 $i 等于 2 时,才会得到“预期”的结果——只显示“i equals 2”。所以,别忘了 break 语句就很重要(即使在某些情况下故意想避免提供它们时)。

[效率]在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。

在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。

<?php

switch ($i)

{

 case 0:

 case 1:

 case 2:

  echo "i is less than 3 but not negative";

  break;

 case 3:

  echo "i is 3";

}

?>

一个 case 的特例是 default。它匹配了任何和其它 case 都不匹配的情况。例如:

<?php

switch ($i)

{

 case 0:

  echo "i equals 0";

  break;

 case 1:

  echo "i equals 1";

  break;

 case 2:

  echo "i equals 2";

  break;

 default:

  echo "i is not equal to 0, 1 or 2";

}

?>

case 表达式可以是任何求值为简单类型的表达式,即整型或浮点数以及字符串。不能用数组或对象,除非它们被解除引用成为简单类型。

【实战】 根据上面的知识点,编写这么一个函数:计算容量值实际代表的字节数

<?php

/**

 * 返回字节数

 *

 * @param string $val 如 400M

 */

function return_bytes($val = '')

{

 $val = trim($val);

 $last = strtolower($val{strlen($val)-1});

 switch ($last)

 {

  case 'g':

   $val *= 1024;

  case 'm':

   $val *= 1024;

  case 'k':

   $val *= 1024;

 }
 return $val;

}
$memorylimit = ini_get('memory_limit');

echo $memorylimit, '<br/>';

echo return_bytes($memorylimit);

输出:

400M

419430400

特别说明:$val = 400M时,case 'm' 被命中,其下的 $val *= 1024; 被执行,但因为没有 break 语言,所以会继续命中 case 'k',并执行其下的 $val *= 1024;语句,so,总体上相当于执行了 400 * 1024 * 1024 。

PHP 相关文章推荐
PHP 5.0对象模型深度探索之绑定
Sep 05 PHP
PHP生成静态页面详解
Dec 05 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP中=赋值操作符对不同数据类型的不同行为
Jan 02 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
跟我学Laravel之请求(Request)的生命周期
Oct 15 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
php上传excel表格并获取数据
Apr 27 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
php中文字符串截取方法实例总结
Sep 30 #PHP
php出现web系统多域名登录失败的解决方法
Sep 30 #PHP
php中运用http调用的GET和POST方法示例
Sep 29 #PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
Sep 29 #PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 #PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 #PHP
推荐25款php中非常有用的类库
Sep 29 #PHP
You might like
桌面中心(二)数据库写入
2006/10/09 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
javascript强制点击广告的方法
2015/02/06 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
解决python运行效率不高的问题
2020/07/20 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
大学生上课迟到检讨书
2014/10/15 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
2015政治思想表现评语
2015/03/25 职场文书
公司内部升职自荐信
2015/03/27 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
python 对图片进行简单的处理
2021/06/23 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA