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 相关文章推荐
怎么使 Mysql 数据同步
Oct 09 PHP
PHP Google的translate API代码
Dec 10 PHP
php长字符串定义方法
Jul 12 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
php基于websocket搭建简易聊天室实践
Oct 24 PHP
PHP数据库操作三:redis用法分析
Aug 16 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
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
Python列表append和+的区别浅析
2015/02/02 Python
在Python中使用元类的教程
2015/04/28 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
财务部出纳岗位职责
2013/12/22 职场文书
优良学风班总结材料
2014/02/08 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
如何正确理解python装饰器
2021/06/15 Python
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
python如何为list实现find方法
2022/05/30 Python
python如何将mat文件转为png
2022/07/15 Python
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript