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));
?>
上面我现在看不懂,结果是一堆数和数组。