本文最后更新于:2024年3月18日 凌晨
PHP 流程控制语句
PHP支持许多传统程序结构来控制程序的执行流程,条件语句(如if/else和switch)依据一些条件,允许程序执行不同的代码块或什么都不执行,循环(如while和for)支持重复执行特定的代码段。
if
- if语句检查一个表达式的真假,如果表达式为true,则执行一条语句,if语句如下所示:
1 2
| if(expression) statement
|
- 当表达式为false时,使用else关键字来指定执行另一条语句:
1 2 3 4 5 6 7 8 9
| if(expression) statement else statement If($user_validated) echo "Welcome!"; else echo "Access Forbidden!";
|
- 要在if语句中包含多条语句,可以使用大括号来包含语句:
1 2 3 4 5 6 7
| if($user_validated) { echo "welcome!"; $greeted = 1; }else{ echo "Access Forbidden!"; exit; }
|
- PHP为if提供了另一种语法,不用大括号将语句段包含起来,而用冒号(:)结束if,并用一个特定的结束关键字来结束代码段(在这里是endif),例如:
1 2 3 4 5 6 7
| if($user_validated): echo "Welcome!"; $greeted = 1; else : echo "Access Forbidden!"; exit; endif;
|
- 在本章描述的其他语句段也有类似的语法(和结束关键字),在语句中有大量HTML代码时,它们将很有用,例如:
1 2 3 4 5 6 7 8 9
| <? if($user_validated):?> <table> <tr> <td>First Name:</td><td>sophia</td> </tr> </table> <?else:?> Please log in. <?endif?>
|
1 2 3 4 5 6 7
| if($good) print('Dandy!'); else if($error) print('Oh,no!'); else print("I'm ambivalent...");
|
- if语句链(连续多个条件判断)是非常常见的,所以PHP提供了一个更简单的语法:elseif语法,例如,前面的代码可以这样重写:
1 2 3 4 5 6
| if($good) print('Dandy!'); elseif($error) print('Oh,no!'); else print("I'm ambivalent...");
|
- 三元条件操作符
?:
可以用于简化ture/false检查,拿一个常见的情况来说,如检查给定的变量是否为true,如果是true,则将打印出某些信息,使用一个普通的if/else语句,如下所示:
1
| <td><? if($active) echo 'yes'; else echo 'no'; ?></td>
|
1
| <? echo '<td>'.($active ? 'yes':'no').'</td>' ?>
|
1 2
| if(expression) true_statement else false_statement (expression) ? true_expression : false_expression
|
- 最主要的区别是条件操作符根本不是一个语句,这意味着它只在表达式中使用,并且一个完整三元表达式的结果本身是一个表达式,如果使用if,echo语句在if条件句中,而当使用三元操作符,echo将在表达式之前。
switch
- 某个变量的值可能决定了在许多不同选择中选择哪一个(例如,变量存放用户名,并且你想要为每个用户做不同的事情),switch语句就是为这种情况设计的。
- switch语句将一个表达式的值和switch中的所有情况(case)比较,匹配的case中的所有的语句都将执行,直到遇到第一个break关键字,如果没有匹配的,并且有给出一个default,则在default关键字之后的所有语句都被执行,直到遇到第一个break关键字。
- 例如下代码:
1 2 3 4 5 6 7 8
| if($name == 'ktatroe')
elseif ($name == 'rasmus')
elseif($name == 'petermac')
elseif($name == 'bobk')
|
可以使用下面的switch语句代替上面的语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| switch($name){ case 'ktatroe': break; case 'rasume': break; case 'petermac': break; case 'book': break; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| switch($name): case 'ktatroe':
break; case 'rasume':
break; case 'petermac':
break; case 'book':
break; endswitch;
|
- 因为从匹配的case到下一个break关键字中的语句都被执行,所以可以将几个case的操作合并在一个中,在下面的例子中,当$name等于"sylvie"或"bruno"时打印"yes"
1 2 3 4 5 6 7 8 9
| switch($name){ case 'sylvie': case 'bruno': print('yes'); break; default: print('no'); break; }
|
- 使用这样的直通(fall-through)代码是个好主意,这样就不需要在某些地方添加break
- 可以为break关键字指定可选的级别数来退出代码执行,用这种方法,一个break语句可以跳出几层的switch嵌套语句。
while
1 2
| while(expression) statement
|
- 如果expression求值为tue,statement就会执行,然后expression会再次求值(如果依然是true,循环体会再次执行,以此类推),当表达式值为false时循环推出。
- 以下例子是将数字1-10相加的代码:
1 2 3 4 5 6
| $total = 0; $i = 1; while($i <= 10){ $total += $i; $i++; endwhile;
|
break
- 可以使用break关键字提前退出循环,在下面的代码中,
$i
从未达到值6,因为当它达到5时循环就停止了:
1 2 3 4 5 6 7 8
| $total = 0; $i = 1; while($i <= 10){ if($i == 5) break; $total += $i; $i++; }
|
- 可以放一个数字再break关键字之后来指明要退出的循环结构为几层,用这种方法,一个被深埋在嵌套循环中的语句可以退出到最外层的循环,例外:
1 2 3 4 5 6 7 8 9 10 11 12 13
| $i = 0; while($i <10){ while($j < 10){ if($j == 5) break 2; $j++; } $i++; } echo $i; echo $j; 0 5
|
continue
- continue语句跳到循环条件的下一轮,和break关键字一样,该语句也可以跳到循环结构中任意的层数的下一轮,和break关键字一样,该语句也可以跳到循环结构中任意的层数的下一轮。
1 2 3 4 5 6 7 8
| while($i <10){ $i++; while($j <10){ if($j == 5) continue 2; $j++; } }
|
- 在这段代码中,continue 2表示跳到从里到外第二级while循环的下一轮,所以$j从未有一个大于5的值,但是$i经历了从0到9的所有值。
do/while
- PHP也支持do/while循环,它使用以下的格式:
1 2 3
| do Statement while(expression)
|
- 使用do/while循环可确保循环体至少被执行一次(第一次):
1 2 3 4 5
| $total = 0; $i = 1; do{ $total += $i++; }while($i <= 10);
|
- 和在不同的while语句中一样,在do/while语句中可以使用break和continue语句。
- do/while语句有时被用于在一个错误条件发生时从一个代码块中退出,例如:
1 2 3 4 5 6
| do{ if($error_condition) break; }while(false);
|
- 因为循环的条件是false,所以循环仅执行以一次,不管在该循环里发生了什么,然而,如果一个错误发生,在break之后的代码将不会被执行。
for
- for语句和while语句类似,除了它增加了计数器初始化和计数器控制表达式之外,并且for语句常常比相同意思的while循环更简短和更容易阅读。
- 这是一个从0到9计数的while循环,打印出每个数:
1 2 3 4 5
| $counter = 0; while($phpcounter <10){ echo "Counter is $counter\n"; $counter++; }
|
1 2
| for($counter = 0;$counter <10;$counter++) echo "Counter is $counter\n";
|
1 2
| for(start; condition;increment) Statement
|
- 表达式start只在for语句的开始执行一次,每次经过循环时,表达式condition都要被检查是否为真,如果为true,则循环体被执行,如果为false,则循环结束,表达式increment在循环体运行之后被计算。
- for语句的另一种语法是:
1 2 3 4
| for(expr1;expr2;expr3): statement; ...; endfor;
|
1 2 3 4
| $total = 0; for($i = 1;$ <= 10:$i++){ $total += $i; }
|
1 2 3 4
| $total = 0; for($i = 1;$ <= 10:$i++): $total += $i; endfor;
|
- for语句中的任意一个表达式都可以指定为多个用逗号分隔的表达式,例如:
1 2 3 4
| $total = 0; for($i = 0,$j = 0;$i <= 10;$i++,$j *=2){ $total += $j; }
|
- 也可以使用空语句,说明不需要设定任何循环条件,在大多数退化的形式中,for语句成为一个死循环,你可能不会想运行下面这个例子,因为它根本不会停止打印:
1 2 3
| for(;;){ echo "Can't stop me!<br/>"; }
|
- 和在while循环一样,在for循环里可以使用break和continue关键字来结束或跳出当前循环。
foreach
- foreach语句可用于遍历数组中的元素,可以使用下面的语句循环遍历一个数组,访问每一个键:
1 2 3
| foreach($array as $current):
}
|
1 2 3
| foreach($array as $key => $value):
endforeach;
|
- 可以使用下面的语句循环遍历一个数组,访问键名和值:
1 2 3
| foreach($array as $key => $value){
}
|
1 2 3
| foreach($array as $key => $value):
endforeach;
|
declare
- declare语句可为一块代码指定执行指令,declare语句的结构如下:
1 2
| declare(directive) statement
|
- 只有一种declare形式:Tick指令,Tick是一个在declare代码段中解释器每执行N条低级语句就会发生的事件,N的值是在declare中的directive部分用ticks=N来制定的,使用tick可以确定一个Tick函数被调用的频率(用代码语句的数目来粗略估计),Tick函数通过
register_tick_function()
注册,例如:
1 2 3 4 5 6
| register_tick_function("some_function"); declare(tick = 3){ for($i = 0;$i <10;$i++){ } }
|
- 在这段代码中,
some_function()
即Tick函数,每次第三条语句执行之后,some_function()
都会被调用。
exit和return
- exit语句会结束当前整个脚本的执行,return语句则使其所在的函数或脚本停止执行。
- exit语句带一个可选值,如果这是一个数字,则是进程的结束状态,如果是一个字符串,该值会在进程终止前被打印出来,die()函数是这种exit语句形式的别名:
1 2 3 4
| $handle = @mysql_connect("localhost",$USERNAME,$PASSWORD); if(!$handle){ die("Could not connect to database"); }
|
1 2
| $handle = @mysql_connect("localhost",$USERNAME,$PASSWORD) or die("Could not connect to database");
|