PHP(五)條件分支和順序流程

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語句能夠簡化這種多級判斷。
spa

<?php
switch (數值型或字符型變量){

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

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

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

      default :
      最後分支;
}
?>

 在switch流程裏,要學習四個關鍵字:switch(開關)、case(狀況)、break(中斷)和default(默認)。調試

用一句話來連起來講:根據開關值得不一樣,執行不一樣的狀況,直到趕上中斷,若是全部的狀況都不符合開關值,那麼就執行默認分支。code

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

上面我如今看不懂,結果是一堆數和數組。

相關文章
相關標籤/搜索