文档章节

PHP(五)条件分支和顺序流程

ChuckleLiu
 ChuckleLiu
发布于 2015/12/22 01:39
字数 3061
阅读 105
收藏 3

PHP脚本有一系列语句构成。一条语句可以是一个赋值语句、一个函数调用、一个循环、一个条件语句甚至是一个什么也不是的语句(空语句)。语句通常以分号结束。程序在执行的时候,从上往下执行代码,在碰到有条件时,运行满足条件的代码。条件分支和顺序流程的特性形成了程序的控制结构。

条件分支

if语句

if,中文意思是如果。if语句用于当指定条件成立时,执行A动作,否则,不执行A动作

<?php
if ($myGirlfriend >= 1){
echo '我有女朋友';
}
?>

if...else语句

if...else语句是若一个条件成立就做一件事,不成立就做另外一件事。

<?php
if ($myGirlfriend >= 1){
echo '我有女朋友';
}
else{
echo '我是单身狗';
}
?>

?...语句(三元运算符)

”expr1 ? expr2 : expr3“这样的语句在PHP中被称为三元运算符,用在某些情况下代替 if...else 语句,使代码更简洁。

<?php
$c = ($a > $b) ? 1 : 1;//如果括号中的条件为真则执行问号后第一个分支,反之进行第二个分支。
?>

这个语句在PHP中被认为是运算符,其求值不是变量,而是语句的结果。在运算时,应直接使用结果进行运算而避免调用函数。

elseif语句

是if与else的组合,是多级关系作用是延伸if语句,可以在原来的if表达式的值1为false时执行不同的语句。和else不一样的是,当elseif语句中的条件表达式求值为TRUE时才执行其分支语句。

以下为该语句的伪代码: 

<?php
if(条件1){
分支一
}
elseif(条件2){
分支二
}
elseif(条件3){
分支三
}
else{
分支四
}
?>

switch语句

多级elseif显然是用于那些可能需要进行多级判断的情况。switch语句可以简化这种多级判断。

<?php
switch (数值型或字符型变量){

      case 变量可能值1 :
          分支一;
      break;

      case 变量可能值2 :
          分支二;
      break;

      case 变量可能值3 :
          分支三;
      break;
      
      ... 

      default :
      最后分支;
}
?>

 在switch流程里,要学习四个关键字:switch(开关)、case(情况)、break(中断)和default(默认)。

用一句话来连起来说:根据开关值得不同,执行不同的情况,直到遇上中断,如果所有的情况都不符合开关值,那么就执行默认分支。

在switch变量这一行里,变量只能是整型、浮点型或字符型。程序先读取这个变量的值,然后在各个case里面查找那个值和这个变量相等,如果相等,条件成立,程序执行其分支,直到碰到break,或者到达了switch句尾,此流程结束。

循环

while语句

while就是”当“的意思,当条件成立(为真)时,就执行大括号里面的语句,当条件不成立(为假)时才不继续进行。

<?php
   while (条件){
    语句
   }
?>

do...while语句

<?php
do{
  循环执行的语句
}
while();
?>

do..while循环与while循环最明显的区别就是前者将判断是否继续循环的条件放在后面。也就是说,就算是条件开始不成立,循环也要被执行一次。

for语句(for循环)

分析前面两个循环,总结出循环中通常有的三个特性:

  • 一个初始化的条件

  • 一个条件成立机会

  • 一个满足条件的值

while循环例子:

<?php
   $i = 1;
   $num = 0;
   
   while ($i <= 100){
    $num += $i;
    $i++;
   }
?>

首先,一个循环开始都有一个初始化的值,例如上面例子中的变量 $i = 1,这样才能形成比较。然后是一个条件成立机会,例如上面例子中的$i <= 100,因为 $i 的值是1,条件成立,随后循环体内对$i进行自加运算,这样就会始终有满足条件的值,如果$i不进行自加运算,这个循环就成了死循环。

说完了上面的,来看看for循环的语法:

<?php

    for(初始化条件;条件;条件改变){
      循环语句
    }
?>

由上面的伪代码可以看出,for循环包含了循环中的三个特性,和while循环不同的是,3个特性不是一次写出来的,而是写在同一行。不过值得注意的是,写在同一行并不表示同时运行,首先运行初始化条件,且只运行一次,然后是循环比较,如果条件成立,则运行最后一句条件改变,执行循环语句。如果条件不成立,直接跳出循环。

利用for循环语句的例子:

<?php
   $num = 0;
   for($i = 1; $i <= 100; $i++){
       $num += $i;
   }
?>

上面的代码程序先执行条件初始化语句$i = 1,然后判断$i <= 100,显然此时该条件成立。于是程序便会执行循环体内的语句$num += $i,最后,执行条件改变语句$i++,此时$i的值变成了2,程序再次判断条件$i <= 100,条件成立,于是开始再一次循环。

foreach循环

foreach循环仅用于数组,当试图用于其他数据类型或是一个未初始化的变量时,便会产生错误。

foreach有两种用法。

第一种用法:

<?php
$ary = array(1, 2, 3, 4, 5, 6);
foreach($ary as $value){
   echo "值:$value<br>\n";
  
}
?>

此段代码中,foreach将$ary中的元素朱各打印,每循环一次就打印一个元素。

第二种用法:

<?php
$ary = arry(1, 2, 3, 4, 5, 6);
foreach($ary as $key => $value){
   echo "索引 $key 的值: $value<br>n\"
}
?>

这段代码与上段代码不同的地方是$value前面多了"$key =>"这个玩意,它的意思是将键名赋给$key,键名是数组元素中的排序号。数组是一组数据的集合,排在第一个位置的元素其键名就是0,而排在第二个位置的元素其键名就是1.上面代码中数组$ary其第一个元素键值是1,键名是0.

总结:

PHP中有4种循环结构,“while”,"do...while","for"和"foreach"。

  • while循环从一开始就检查条件是否成立,如果成立就执行循环语句,不成立就跳出循环,不执行循环语句。

  • do...while循环从一开始就执行一次循环语句,然后检查条件是否成立,如果成立就继续执行循环语句,不成立就跳出循环。

  • for循环是最灵活的循环,因为for循环包括了循环的3个特性,合理的使用for循环,将会使代码更加简洁。

  • foreach循环仅用于数组,遍历数组是最快的。

关键字

break语句

一个伪代码栗子:

<?php
while(已跑圈数 < 要求跑完的圈数){
   //这里做一个判断
   if(累了){
     break;  //不跑了
   }
}
?>

这是一个跑步的栗子,从while开始跑圈,假设已跑圈数小于要求跑完的圈数,继续跑圈,在while代码块中,有一个if判断是否跑累了,条件成立就执行break,跳出循环。

另一个伪代码栗子:

<?php
while(已跑圈数 < 要求跑完的圈数 && 我不累){
     //继续跑
}
?>

这种方法把判断合到了while中,让while判断已跑圈数小于要求跑完的圈数,并且不累才继续跑。

上面的两种方法有所不同,但目的都是一样的。

来一个具体的代码:

<?php
$quanShu = 50;  //设定要跑圈数
$yiPao = 0;   //设定初值
$tiLi = 10;   //设定体力值

while($yiPao < $quanShu){
    echo "已跑".$yiPao."圈<br>\n";
    $yiPao++;    //每跑一圈就加一圈
    $tiLi--;     //每跑一圈就消耗1体力
    if($tiLi == 0){    //判断当体力消耗完时
       echo "现在跑第".$yiPao."圈,体力剩下".$tiLi.",不跑了!累死了!";
       break;      //使用break跳出循环
    }
    echo "继续跑第".$yiPao."圈<br>\n";
}
?>

效果:

已跑0圈
继续跑第1圈
已跑1圈
继续跑第2圈
已跑2圈
继续跑第3圈
已跑3圈
继续跑第4圈
已跑4圈
继续跑第5圈
已跑5圈
继续跑第6圈
已跑6圈
继续跑第7圈
已跑7圈
继续跑第8圈
已跑8圈
继续跑第9圈
已跑9圈
现在跑第10圈,体力剩下0,不跑了!累死了!

break用于当一个条件满足时,跳出整个循环。

continue语句

可用于附加一个条件判断符合循环条件的情况下,当次循环语句是否执行,若满足判断条件,执行循环语句,开始下一次循环,若不满足,跳过循环语句,执行下一次循环。

continue与break不同的是,满足某一个条件时continue仅仅跳出这一个循环,而不跳出整个循环,而使用break则会跳出整个循环。

假设你要煎十个鸡蛋,但是敲开的是坏的话就扔了,可以使用continue语句写代码

伪代码:

<?php
while(敲开的鸡蛋数 < 10个鸡蛋){
   if(鸡蛋是坏的){
      echo "这个鸡蛋坏掉了不能煎";
      continue;   //从这里跳出这一次循环,从循环开始处重新开始
   }
   echo "煎鸡蛋"; 
}
?>

真代码:

<?php
$jiDan = 10; //10个鸡蛋
$yiQiao = 0;  //已经敲开的鸡蛋
$badEgg = 3;  //假设第三个鸡蛋坏掉了

while($yiQiao < $jiDan){
   $yiQiao++;   //敲一个就加1
   if($yiQiao == $badEgg){   //判断是否是坏鸡蛋
      echo "这个鸡蛋坏掉了不能煎!<br>\n";
      continue; //跳出循环回到循环开始,继续敲下一个鸡蛋
   }
   echo "敲了".$yiQiao."个鸡蛋<br>\n"; 
}
?>

效果:

敲了1个鸡蛋
敲了2个鸡蛋
这个鸡蛋坏掉了不能煎!
敲了4个鸡蛋
敲了5个鸡蛋
敲了6个鸡蛋
敲了7个鸡蛋
敲了8个鸡蛋
敲了9个鸡蛋
敲了10个鸡蛋

如果上面continue换成break,后面的鸡蛋都不会被敲。

return语句

return的意思是返回,return之后的代码不会被执行。如果在函数中调用return,那么立即停止执行函数中剩余的代码;如果是在文件中调用return,那么该文件会立即停止执行剩余的代码。

在下一个博文PHP(六)中也有讲到。

异常处理

异常处理的代码结构:

<?php
try{
        //需要异常处理的代码
}
catch (Exception $e){
    echo "捕获到异常:".$e -> getMessage();
}
?>

需要进行异常处理的代码都必须放到try代码块当中,以便捕获可能存在的异常。每一个try都至少要有一个与之对应的catch,使用多个catch能够捕获不同的类所产生的异常。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,代码就会在跳转到最后一个catch的后面继续执行。而一旦抛出异常,则try区块中抛出的异常代码行后面的代码将停止执行。

举一个栗子:

<?php
    try {
       $error = '连接数据库失败';    //这里假设数据库连接失败
       throw new Exception($error);
       
       //从这里开始,代码将不会被执行
       echo "永远都不会执行";
    }
    catch (Exception $e) {
       echo "捕获异常:", $e->getMessage(),"\n";
    }
    
    echo "从这里继续执行";
?>

上面的我看不懂

declare语句

declare用来设定一段代码的执行指令,按照PHP文档的说法,目前只接受一个指令ticks,这个指令通常用来调试。

但是通常在程序开发中,有IDE可以调试,或者另有功能强大的专业测试工具,因此这个指令很少被使用,这里仅作了解。

举一个栗子:

<?php
//记录时间的函数
function profile($dump = FALSE){
    static $profile;
    if ($dump) {
       $temp = $profile;
       unset($profile);
       return($temp);
    }
    $profile[] = microtime();
}

//注册tick指令处理函数
register_tick_function("profile");

//初始时间
profile();

//评估的代码,两条低级语句就记录一次时间
declare(ticks=2){
    for($x = 1; $x < 50; ++$x){
        echo similar_text(md5($x), md5($x*$x)), "<br />;";
    }
}

//显示调试数据
print_r(profile (TRUE));
?>

上面我现在看不懂,结果是一堆数和数组。

© 著作权归作者所有

共有 人打赏支持
ChuckleLiu
粉丝 2
博文 15
码字总数 10402
作品 0
南岸
javaScript基础(四)流程控制

javascript流程控制 流程:就是程序代码的执行顺序。 流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行。 一、顺序结构 按照书写顺序来执行,是程序中最基本的流程结构。 二、选...

曾杨
2013/12/28
0
0
LAMP兄弟连PHP课程学习笔记 第四天 流程控制分支语句

流程控制 一、顺序结构 二、分支结构、条件结构、选择结构 1、单路分支 if(条件)//条件bool、ture或false等等 { 代码段 } 2、双路分支 if(条件) { 代码段 }else{ 代码段 } 3、多路分支 if(条...

梁小泊
2011/04/11
0
0
工作流系统开发之二十三 图解工作流的基本路由方式

上一篇主要说明 dotnet工作流引擎的基本原理和引擎的基本元素。 这篇主要以图解的方式说明工作流引擎的运转模型,路由方式。 一个业务流程包含一序列的处理过程,以及他们的相互顺序关系,还...

长平狐
2012/10/11
50
0
工作流系统之三十一 回退流的实现

在流程建模的时候,定义好了返回的线路,这种严格来说,不是回退流。例如,审核不通过,则返回重新填写,这种只是条件路由。 工作流的回退流,是流程实例在流转的过程中,可以回退到运行轨迹...

长平狐
2012/10/11
71
0
BPM领域常用的两款工作流JBPM和CCBPM的对比

以国外流行的工作流jbpm4的模式与当今中国开源的ccbpm(ccflow和jflow的总称)流程引擎对照。以便让各位能够了解到中国国情的工作流引擎与国际流行的设计规则的差别、不同、与优缺点。 国外工...

Vktun
2015/07/31
0
11

没有更多内容

加载失败,请刷新页面

加载更多

emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
33分钟前
2
0
rabbitmq学习(二)

生产者消费者初级案列 ChannelUtils package com.hensemlee.rabbitmq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Connecti......

hensemlee
43分钟前
1
0
MarkDown入门简介

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式。Markdown的语法简洁明了、学习容易,而且功能比纯文本更强,因此有很多...

一零贰IV
47分钟前
1
0
druid配置db2参考记录

Driver Name:COM.ibm.db2.jdbc.app.DB2 Driver Type 4 Driver URL Pattern:jdbc:db2://ServerIP:50000/databasename ${driverClassName} 这个参数没有在spring相关的properties文件中配置 ......

tonyfox
50分钟前
1
0
用户体验要素——以用户为设计中心

一、用户体验是什么 产品会与外界发生联系,人们如何去使用产品,人们使用产品无非解决两种问题,一,提高效率;二娱乐。而用户体验兼顾着功能和界面两个方面,为的是“提高人们的工作效率”...

铸剑为犁413
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部