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语句可以简化这种多级判断。
<?php switch (数值型或字符型变量){ case 变量可能值1 : 分支一; break; case 变量可能值2 : 分支二; break; case 变量可能值3 : 分支三; break; ... default : 最后分支; } ?>
在switch流程里,要学习四个关键字:switch(开关)、case(情况)、break(中断)和default(默认)。
用一句话来连起来说:根据开关值得不同,执行不同的情况,直到遇上中断,如果所有的情况都不符合开关值,那么就执行默认分支。
在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)); ?>
上面我现在看不懂,结果是一堆数和数组。