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 采集程序 常用函数
Dec 18 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
php array_keys 返回数组的键名
Oct 25 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
Thinkphp 中 distinct 的用法解析
Dec 14 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
常用的php ADODB使用方法集锦
2008/03/25 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
PHP编写简单的App接口
2016/08/28 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
利用python实现数据分析
2017/01/11 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
python代码如何注释
2020/06/01 Python
Python csv文件记录流程代码解析
2020/07/16 Python
python speech模块的使用方法
2020/09/09 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
升旗仪式主持词
2014/03/19 职场文书
党风廉设责任书
2014/04/16 职场文书
廉政教育的心得体会
2014/09/01 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
可可西里观后感
2015/06/08 职场文书
丧事主持词
2015/07/02 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
争做文明公民倡议书
2019/06/24 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书