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在Web开发领域的优势
Oct 09 PHP
简单的PHP图片上传程序
Mar 27 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
header跳转和include包含问题详解
Sep 08 PHP
php session劫持和防范的方法
Nov 12 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 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
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue 左滑删除功能的示例代码
2019/01/28 Javascript
vue多次循环操作示例
2019/02/08 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python回调函数用法实例详解
2015/07/02 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python上下文管理器全实例详解
2019/11/12 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
python urllib和urllib3知识点总结
2021/02/08 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
电子商务专业应届毕业生求职信
2014/06/21 职场文书
小学运动会报道稿
2014/10/04 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
mysql 子查询的使用
2022/04/28 MySQL