任何 PHP 腳本都是由一系列語(yǔ)句構(gòu)成的。一條語(yǔ)句可以是一個(gè)賦值語(yǔ)句,一個(gè)函數(shù)調(diào)用,一個(gè)循環(huán),甚至一個(gè)什么也不做的(空語(yǔ)句)條件語(yǔ)句。語(yǔ)句通常以分號(hào)結(jié)束。此外,還可以用花括號(hào)將一組語(yǔ)句封裝成一個(gè)語(yǔ)句組。語(yǔ)句組本身可以當(dāng)作是一行語(yǔ)句。本章講述了各種語(yǔ)句類(lèi)型。
在任何一門(mén)程序設(shè)計(jì)語(yǔ)言中,都需要支持滿足程序結(jié)構(gòu)化所需要的三種基本結(jié)構(gòu):
- 順序結(jié)構(gòu)
- 分支結(jié)構(gòu)(選擇結(jié)構(gòu))
- 循環(huán)結(jié)構(gòu)
順序結(jié)構(gòu):在程序結(jié)構(gòu)中,最基本的就是順序結(jié)構(gòu)。程序會(huì)按照自上而下的順序執(zhí)行。
分支結(jié)構(gòu)
單一條件分支結(jié)構(gòu)(if)
基本格式:
if(條件表達(dá)式){
語(yǔ)句組;
//語(yǔ)句組為單條語(yǔ)句時(shí)可省略“{ }”。
}
當(dāng)條件表達(dá)式的值為真(true)時(shí),PHP將執(zhí)行語(yǔ)句組,相反條件表達(dá)式的值為假(false)時(shí),PHP將不執(zhí)行語(yǔ)句組,忽略語(yǔ)句組執(zhí)行下面的語(yǔ)句。
<?php
if ($a > $b)
echo "a 大于 b"; //如果變量a的值大于b的值則會(huì)輸出:a大于b
$x=10;
$y=20;
if($x<$y){ //判斷是否x小于y。多條語(yǔ)句需要使用{ }括起來(lái)。
$t=$x;
$x=$y;
$y=$t;
}
var_dump($x>$y); //輸出:bool(true)
?>
雙向條件分支結(jié)構(gòu)(else從句)
格式如下
if(條件表達(dá)式){
語(yǔ)句組1
}else{
語(yǔ)句組2
}
if-else 條件判斷與 if 條件判斷類(lèi)似,所不同的是,if-else 語(yǔ)句的條件表達(dá)式值為真(true)時(shí),會(huì)執(zhí)行 if 的本體語(yǔ)句(語(yǔ)句組1),而條件表達(dá)式值為假(false)時(shí),則執(zhí)行 else 的本體語(yǔ)句(語(yǔ)句組2)。
多向條件分支結(jié)構(gòu)(elseif子句)
格式如下
if(條件表達(dá)式1){
語(yǔ)句塊1
}elseif(條件表達(dá)式2){
語(yǔ)句塊2
... ...
}elseif(條件表達(dá)式n){
語(yǔ)句塊n
}else{
語(yǔ)句塊n+1
}
<?php
date_default_timezone_set("Etc/GMT-8"); //設(shè)置時(shí)區(qū),中國(guó)大陸采用東八區(qū)的時(shí)間
echo "當(dāng)前時(shí)間".date("Y-m-d H:i:s",time())." "; //通過(guò)date()函數(shù)獲取當(dāng)前時(shí)間,并輸出
$hour = date("H"); //獲取服務(wù)器時(shí)間中當(dāng)前的小時(shí),作為分時(shí)問(wèn)候的條件
if( $hour < 6 ) { //如果當(dāng)前時(shí)間在6點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "凌晨好!";
} elseif ( $hour < 9 ) { //如果當(dāng)前時(shí)間在6點(diǎn)之后和9點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "早上好!";
} elseif ( $hour < 12 ) { //如果當(dāng)前時(shí)間在9點(diǎn)之后和12點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "上午好!";
} elseif ( $hour < 14 ) { //如果當(dāng)前時(shí)間在12點(diǎn)之后和14點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "中午好!";
} elseif ( $hour < 17 ) { //如果當(dāng)前時(shí)間在14點(diǎn)之后和17點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "下午好!";
} elseif ( $hour < 19 ) { //如果當(dāng)前時(shí)間在17點(diǎn)之后和19點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "傍晚好!";
} elseif ( $hour < 22 ) { //如果當(dāng)前時(shí)間在19點(diǎn)之后和22點(diǎn)以前,執(zhí)行下面的語(yǔ)句塊
echo "晚上好!";
} else { //如果當(dāng)前時(shí)間在22點(diǎn)之后和次日1點(diǎn)以前,執(zhí)行下面語(yǔ)句塊
echo "夜里好!";
}
多向條件分支結(jié)構(gòu)(switch語(yǔ)句)
語(yǔ)句語(yǔ)法:
switch(表達(dá)式){
case 值1:
語(yǔ)句序列1; break;
case 值2:
語(yǔ)句序列2; break;
…
default:
語(yǔ)句序列 n; break;
}
當(dāng)程序執(zhí)行碰到switch條件判斷時(shí),它會(huì)取出鍵值,然后與語(yǔ)句體中的case所列出的值逐一比較,如果數(shù)值不符合,則將數(shù)值往下一個(gè)case傳遞,如果數(shù)值符合,則執(zhí)行case中的語(yǔ)句,然后再碰到break語(yǔ)句即跳出switch條件判斷,如果所有的值比對(duì)都不符合,則會(huì)執(zhí)行default中的語(yǔ)句 。
switch語(yǔ)句使用注意事項(xiàng):
switch語(yǔ)句與if語(yǔ)句不同,它僅能判斷一種關(guān)系:是否恒等。
switch語(yǔ)句中case子句的常量可以是整型常量、字符型常量、表達(dá)式或變量。
在同一個(gè)switch中,case子句的常量不能相同,否則第二個(gè)值永遠(yuǎn)無(wú)法匹配到。
case 和 default 子句后面的語(yǔ)句序列允許由多個(gè)可執(zhí)行語(yǔ)句組成,且不必用“{ }”括起來(lái),也可以為空語(yǔ)句。
switch語(yǔ)句中可省略break語(yǔ)句和default子句。但省略后會(huì)改變流程。
<?php
$week = date("D");
switch( $week ) {
case "Mon": echo "星期一"; break;
case "Tue": echo "星期二"; break;
case "Wed": echo "星期三"; break;
case "Thu": echo "星期四"; break;
case "Fri": echo "星期五"; break;
case "Sat": echo "星期六"; break;
case "Sun": echo "星期日"; break;
}
switch( $i ) { //條件表達(dá)式是一個(gè)變量$i
case 2: //和值2匹配時(shí),沒(méi)有break,將控制轉(zhuǎn)移到下一個(gè)case中的語(yǔ)句
case 3: //和值3匹配時(shí),執(zhí)行下面的語(yǔ)句塊
echo "\$i和值2或3任一個(gè)匹配";
break; //退出switch語(yǔ)句
case 4: //和值為3匹配上時(shí),執(zhí)行下面的語(yǔ)句塊
echo "\$i和值4匹配時(shí),才會(huì)執(zhí)行";
break; //退出switch語(yǔ)句
default: //匹配任何和其他case都不匹配的情況, 要放在最后一個(gè)case之后
echo "\$i沒(méi)有匹配的值時(shí),才會(huì)執(zhí)行";
}
巢狀條件分支結(jié)構(gòu)
語(yǔ)法:
if(表達(dá)式1){
if(表達(dá)式2){
.. .. ..
}else{
.. .. ..
}
}else{
if(表達(dá)式3){? …
}
}
巢狀式條件分支結(jié)構(gòu)就是if語(yǔ)句的嵌套,即指if或else后面的語(yǔ)句塊中又包含if語(yǔ)句。if語(yǔ)句可以無(wú)限層地嵌套在其他if語(yǔ)句,這給程序的不同部分的條件執(zhí)行提供了充分的彈性。
巢狀式if..else流程控制使用范例:
<?php
$a=88;
echo "數(shù)學(xué)成績(jī): $A <p>";
if($a>=60){
if($a>=70){
if($a>=90){
echo "不錯(cuò)喔!!這次數(shù)學(xué)成績(jī)甲等!!";
}else{
echo "還可以...這次數(shù)學(xué)成績(jī)乙等!!";
}
}else{
echo "勉勉強(qiáng)強(qiáng)及格邊緣...這次數(shù)學(xué)成績(jī)丙等!!";
}
}else{
echo "有待下次努力...數(shù)學(xué)成績(jī)不及格!!";
}
?>
循環(huán)結(jié)構(gòu)
while語(yǔ)句
while循環(huán)語(yǔ)法:
while(表達(dá)式){
語(yǔ)句或語(yǔ)句序列
... ...
}
當(dāng)while循環(huán)語(yǔ)句中表達(dá)式(循環(huán)控制語(yǔ)句)的結(jié)果為真時(shí),程序?qū)⒎磸?fù)執(zhí)行同一段程序:循環(huán)體( while中的語(yǔ)句或語(yǔ)句序列),直到滿足一定的條件(表達(dá)式的結(jié)果為假時(shí))后才停止執(zhí)行該段程序。
實(shí)例:
<?php
//求1到100的累加。
$i=1;
$sum=0;
while($i<=100)
{
$sum+=$i;
$i++;
}
echo $sum;
?>
嘗試一下吧
<html>
<head><title>使用while循環(huán)嵌套輸出表格</title></head>
<body>
<table align="center" border="1" width=600>
<caption><h1>使用while循環(huán)嵌套輸出表格</h1></caption>
<?php
$out = 0; //外層循環(huán)需要計(jì)數(shù)的累加變量
while( $out < 10 ) { //指定外層循環(huán),并且循環(huán)次數(shù)為10次
$bgcolor = $out%2 == 0 ? "#FFFFFF" : "#DDDDDD";
echo “<tr bgcolor=”.$bgcolor.“>”; //執(zhí)行一次則輸出一行并指定背景顏色
$in = 0; //內(nèi)層循環(huán)需要計(jì)數(shù)的累加變量
while( $in < 10 ) { //指定內(nèi)層循環(huán),并且循環(huán)次數(shù)為10次
echo "<td>".($out*10+$in)."</td>"; //執(zhí)行一次,輸出一個(gè)單元格
$in++; //內(nèi)層的計(jì)數(shù)變量累加
}
echo "</tr>"; //輸出行關(guān)閉標(biāo)記
$out++; //外層的計(jì)數(shù)變量累加
}
?>
</table>
</body>
</html>
do...while循環(huán)
基本格式:
do{
語(yǔ)句或語(yǔ)句序列
... ...
}while(表達(dá)式);
程序會(huì)先執(zhí)行 do 語(yǔ)句體中的語(yǔ)句(循環(huán)體),然后再檢查表達(dá)式(循環(huán)控制語(yǔ)句)的值,如果符合條件式(值為真),就再進(jìn)行 do 語(yǔ)句體中的語(yǔ)句,直到條件不符合為止
注意:
do-while 后面必須加上分號(hào)作為結(jié)束
do-while與while的最大區(qū)別是先執(zhí)行循環(huán)體然后再判斷循環(huán)的控制條件
<?php //求1到100的累加。
$i=1; ?$sum=0;
do{
$sum+=$i;
$i++;
}while($i<=100);
echo $sum;
?>
for循環(huán)
基本格式:
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語(yǔ)句或語(yǔ)句序列;
}
for循環(huán)語(yǔ)句中表達(dá)式1為循環(huán)初始條件;表達(dá)式2為循環(huán)控制條件;表達(dá)式3為控制變量遞增;語(yǔ)句或語(yǔ)句序列為循環(huán)體。
<?php
//使用花括號(hào)“{}”將代碼塊括起來(lái),通常代碼塊為一條時(shí)可以不加花括號(hào)
for( $i = 1; $i <= 10; $i++ ) {
echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
}
$i = 1; //將for語(yǔ)句中第一部分初始化提出來(lái),放到for前面執(zhí)行,但for語(yǔ)句中的分號(hào)要保留
for( ; $i <= 10; $i++ ) {
echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
}
$i = 1; //再將第三部分的增量提出來(lái),放到for語(yǔ)句的執(zhí)行體最后,但也要將分號(hào)保留
for( ; $i <= 10; ) {
echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
$i++;
}
$i = 1;
for( ; ; ) {
if( $i > 10 )
break;
echo "這是第<b> $i </b>次循環(huán)執(zhí)行輸出的結(jié)果<br>";
$i++;
}
特殊的流程控制語(yǔ)句
- break
我們之前在 switch 條件判斷中已經(jīng)使用過(guò) break 關(guān)鍵字,它會(huì)使得程序流程離開(kāi) switch 本體中的語(yǔ)句,如果 break 使用在 for、while 或 do-while 循環(huán)結(jié)構(gòu)中時(shí),將會(huì)使得程序離開(kāi)該層循環(huán)。 - continue
continue 的作用與 break 有點(diǎn)類(lèi)似,continue 若使用在 for、while 或 do-while循環(huán)結(jié)構(gòu)中,當(dāng)程序執(zhí)行至 continue 時(shí),之后的語(yǔ)句將直接被略過(guò),而直接執(zhí)行下一次的循環(huán)動(dòng)作。
- exit
當(dāng)前的腳本中只要執(zhí)行到exit語(yǔ)句,而不管它在哪個(gè)結(jié)構(gòu)中都會(huì)直接退出當(dāng)前腳本。exit是一個(gè)函數(shù),當(dāng)前使用過(guò)的die( )函數(shù)就是exit( )的別名。可以帶參數(shù)輸出一條消息,并退出當(dāng)前腳本。
Have a try
- 四種9X9乘法表(for循環(huán))
- 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加由鍵盤(pán)控制。(while循環(huán))