流程控制

一、判断

判断用白话讲就是如果怎么样就怎么样要不然就怎么样。

用的是“if”这个前面我们已经用过,这里我们详细讲一下。完整的if是

1 if(expr1){//如果怎样
2 //code1  //就怎样
3 }elseif(expr2){ //要不然如果怎样
4 //code2 //就怎样
5 }else{ //要不然
6 //code3 //怎样
7 }

上面的代码中有三个条件,expr1,expr2,以及这两种以外,如果只有两种条件,可以把中间elseif去掉即可,如果有4种5种。。。只要继续写elseif即可,程序将从上到下去匹配expr直到为true。其中elseif也可以写成,else if中间有个空格,当code们只有一句时可以去掉大括号,但是,为了代码清晰,我们还是加上比较好,以免出错。还有一点,当只有一个条件时,甚至可以不要else。下面例子将展示所有类型

01 //四个条件
02 $a=1.8;
03 $b=2;
04 if($a<0){
05 echo "$a<0";
06 }else if($a<1)
07 echo "$a<1";//我没有使用大括号
08 elseif($a<2){//我和上面的else if不同
09 echo "$a<2";
10 }else{
11 echo "$a>=2";
12 }
13 //一个条件
14 if($a==$b){
15 echo '$a==$b';
16 }
17 //尽量使用括号的忠告看看下面的代码 想想结果是否和你想的一样
18 if($a>1)
19    $b=$a;
20    $a=2;
21    $b*=$a;
22 echo $b;

二、循环

循环比较多,分别介绍下。

for:可以理解为,从一个值到另一个值,一直做某件事。for的写法是

for (expr1; expr2; expr3)
    code

第一个表达式(expr1)在循环开始前无条件求值一次。

expr2 在每次循环开始前求值。如果值为 TRUE,则继续循环,执行嵌套的循环语句。如果值为 FALSE,则终止循环。

expr3 在每次循环之后被求值(执行)。 expr3不一定出现在小括号里面,也可以写在code里面,总之就是要让expr2有能变成false否则将陷入死循环简单例子

1 for ($i = 1; $i <= 10; $i++) {
2     echo $i."\n";
3 }

while:可以理解为,当怎么样那么就一直怎么样。while的写法是

while (expr)
    code
它告诉 PHP 只要 while 表达式的值为 TRUE 就重复执行嵌套中的循环语句。表达式的值在每次开始循环时检查,所以即使这个值在循环语句中改变了,语句也不会停止执行,直到本次循环结束。有时候如果 while 表达式的值一开始就是 FALSE,则循环语句一次都不会执行。这里要注意要给expr有false的机会,否则将陷入死循环。
1 $i=1;
2 while($i<=10){
3 echo $i."\n";
4 $i++;
5 }

do-while:这个基本上和while是一样的唯一的区别在,无论while判断是否为true,都会执行一次,循环体。do-while的写法

1 do{
2 //code
3 }while(expr);
1 //同样输出1到10
2 $i=1;
3 do{
4   echo $i."\n";
5   $i++;
6 }while($i<=10);

foreach:这个在前面有介绍过,就是遍历数组并且只能用于遍历数组。如果提供给foreach的不是数组,将会出现致命错误。Invalid argument supplied for foreach();foreach的写法有两种

foreach (array_expression as $value)
    code
foreach (array_expression as $key => $value)
    code
1 $arr = array(1,2,3,4);
2 foreach($arr as $v){
3   echo $v."\n";
4   $v = 0;
5   echo $v."\n";
6 }
7 var_dump($arr);
第一种方法遍历数组的值将值赋值给value,而第二种方法把值赋值给value把key赋值给key
注意:除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。所以被foreach操作的数组本身不发生变化。
switch:switch可以理解为很多个if。
01 switch ($i) {
02     case 0:
03         echo "i equals 0";
04         break;
05     case 1:
06         echo "i equals 1";
07         break;
08     case 2:
09         echo "i equals 2";
10         break;
11    default:
12    echo "i equals nothing";
13 }
为避免错误,理解 switch 是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break的话,PHP 将继续执行下一个 case 中的语句段。另外如果一个case也没匹配上,将会执行default:;试试下面的代码
1 $i=0;
2 switch ($i) {
3     case 0:
4         echo "i equals 0";
5     case 1:
6         echo "i equals 1";
7     case 2:
8         echo "i equals 2";
9 }

这里如果 $i 等于 0,PHP 将执行所有的 print 语句!如果 $i 等于 1,PHP 将执行后面两条 print 语句。只有当 $i 等于 2 时,才会得到“预期”的结果——只显示“i equals 2”。所以,别忘了 break 语句就很重要(即使在某些情况下故意想避免提供它们时)。

在 switch 语句中条件只求值一次并用来和每个 case 语句比较。在 elseif 语句中条件会再次求值。如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用 switch 语句可能会快一些。

在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句。

 break:break 结束当前 forforeachwhiledo-while 或者 switch 结构的执行。

break可以接受一个可选的数字参数来决定跳出几重循环。 试试下面的代码

1 for ($i = 1; $i <= 10; $i++) {
2     echo $i."\n";
3     if($i>4){
4        break;
5      }
6 }

continue:continue和break类似,只是他用来跳过本次循环。continue后面也可以接数字表示跳出几重循环。试试下面的代码,看看和你想的是不是一样吧

1 for ($i = 0; $i < 5; ++$i) {
2     if ($i == 2)
3         continue
4     print "$i\n";
5 }

三、其他

declare:directive 部分允许设定 declare 代码段的行为。其实这个不常用。至少在我工作中没用到,他可以使用其他方式替代。不去了解也罢。

 return:即返回,用在函数中。

如果在一个函数中调用 return() 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return()也会终止 eval() 语句或者脚本文件的执行。

如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include() 的或者 require()的,则控制交回调用文件。此外,如果当前脚本是被 include() 的,则 return() 的值会被当作 include() 调用的返回值。如果在主脚本文件中调用 return(),则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。

注意: return() 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。

试试下面的代码看看是不是和你想的一样

1 function zhuge(){
2   $i=0;
3  
4   return $i;
5   $i = 1;
6   echo $i."\n";
7 }
8 test();
9 var_dump(test);

goto:顾名思义即跳到某处执行,但是因为使用goto会使代码流程不混乱,所以我们不推荐大家使用。也就不具体讲了。

另外提供了一些流程控制的替代语法,包括 ifwhileforforeach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及endswitch;。 当看到别人写得代码出现这种形式的时候不要不认识即可,有时候html和php混合写得时候也可以用这种形式来使代码更加易读。

接下来是我们从一开始到现在来第一次接触到两个或两个以上文件。

include和include_once两者都是包含并运行文件,唯一的区别是,include_once如果该文件中的代码已经被包含了,则不会再次包含。其实我们可以这样想,包含了以后,两个php文件可以看成一个php文件,就这么简单。

require和require_once:和include其实是一样的,唯一的区别是当包含失败时,include() 产生一个Warning而 require() 则导致一个致命错误,使脚本停止运行。其实也可以从字面上去理解,include仅仅是包含,require不仅仅是包含还是需求。

新建a.php,b.php两个文件分别写入如下代码然后运行b.php看看效果吧

1 <?php
2 function zhuge(){
3 echo "qaforcode.net";
4 }
5 ?>

 

1 <?php
2 include(dirname(__FILE__)."/a.php");
3 test();
4 ?>

过会儿试试下面两个代码,和上面一样分别写在两个文件中

1 <?php
2 echo "我是文件a!\n";
3 echo "include_once\n";include_once("b.php");
4 echo "include_once\n";include_once("b.php");
5 echo "include\n";include("b.php");
6 echo "文件a结束了\n";
7 ?>

 

1 <?php
2 echo "我是文件b\n";
3 ?>

然后运行文件a看看效果吧

本文固定链接: http://www.qaforcode.net/archives/243 | 猪哥每日一贴

你可能感兴趣的:(流程控制)