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

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));
?>

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

你可能感兴趣的:(PHP(五)条件分支和顺序流程)