PHP腳本有一系列語句構成。一條語句能夠是一個賦值語句、一個函數調用、一個循環、一個條件語句甚至是一個什麼也不是的語句(空語句)。語句一般以分號結束。程序在執行的時候,從上往下執行代碼,在碰到有條件時,運行知足條件的代碼。條件分支和順序流程的特性造成了程序的控制結構。php
if,中文意思是若是。if語句用於當指定條件成立時,執行A動做,不然,不執行A動做
數據庫
<?php if ($myGirlfriend >= 1){ echo '我有女友'; } ?>
if...else語句是若一個條件成立就作一件事,不成立就作另一件事。
數組
<?php if ($myGirlfriend >= 1){ echo '我有女友'; } else{ echo '我是單身狗'; } ?>
」expr1 ? expr2 : expr3「這樣的語句在PHP中被稱爲三元運算符,用在某些狀況下代替 if...else 語句,使代碼更簡潔。
函數
<?php $c = ($a > $b) ? 1 : 1;//若是括號中的條件爲真則執行問號後第一個分支,反之進行第二個分支。 ?>
這個語句在PHP中被認爲是運算符,其求值不是變量,而是語句的結果。在運算時,應直接使用結果進行運算而避免調用函數。工具
是if與else的組合,是多級關係做用是延伸if語句,能夠在原來的if表達式的值1爲false時執行不一樣的語句。和else不同的是,當elseif語句中的條件表達式求值爲TRUE時才執行其分支語句。
學習
如下爲該語句的僞代碼: 測試
<?php if(條件1){ 分支一 } elseif(條件2){ 分支二 } elseif(條件3){ 分支三 } else{ 分支四 } ?>
多級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就是」當「的意思,當條件成立(爲真)時,就執行大括號裏面的語句,當條件不成立(爲假)時纔不繼續進行。
<?php while (條件){ 語句 } ?>
<?php do{ 循環執行的語句 } while(); ?>
do..while循環與while循環最明顯的區別就是前者將判斷是否繼續循環的條件放在後面。也就是說,就算是條件開始不成立,循環也要被執行一次。
分析前面兩個循環,總結出循環中一般有的三個特性:
一個初始化的條件
一個條件成立機會
一個知足條件的值
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有兩種用法。
第一種用法:
<?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循環僅用於數組,遍歷數組是最快的。
一個僞代碼栗子:
<?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與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,那麼該文件會當即中止執行剩餘的代碼。
在下一個博文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用來設定一段代碼的執行指令,按照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)); ?>
上面我如今看不懂,結果是一堆數和數組。