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数组
Oct 09 PHP
php discuz 主题表和回帖表的设计
Mar 13 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
PHP正则表达式之定界符和原子介绍
Oct 05 PHP
php多文件上传下载示例分享
Feb 20 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
php 的多进程操作实践案例分析
Feb 28 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
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
js闭包的用途详解
2014/11/09 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
树结构之JavaScript
2017/01/24 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
学习python类方法与对象方法
2016/03/15 Python
Python解决八皇后问题示例
2018/04/22 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
python代码编写计算器小程序
2020/03/30 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python实现的Iou与Giou代码
2020/01/18 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
韩国商务邀请函
2014/01/14 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
销售顾问工作计划书
2014/08/15 职场文书
清洁工岗位职责
2015/02/13 职场文书
联谊活动总结范文
2015/05/09 职场文书
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android