流程控制

一、判断

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

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

if(expr1){//如果怎样
//code1  //就怎样
}elseif(expr2){ //要不然如果怎样
//code2 //就怎样
}else{ //要不然
//code3 //怎样
}

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

//四个条件
$a=1.8;
$b=2;
if($a<0){
echo "$a<0";
}else if($a<1)
echo "$a<1";//我没有使用大括号
elseif($a<2){//我和上面的else if不同
echo "$a<2";
}else{
echo "$a>=2";
}
//一个条件
if($a==$b){
echo '$a==$b';
}
//尽量使用括号的忠告看看下面的代码 想想结果是否和你想的一样
if($a>1)
   $b=$a;
   $a=2;
   $b*=$a;
echo $b;

二、循环

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

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

for (expr1; expr2; expr3)
    code

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

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

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

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

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

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

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

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

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

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

这里如果 $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可以接受一个可选的数字参数来决定跳出几重循环。 试试下面的代码

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

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

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

三、其他

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

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

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

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

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

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

function zhuge(){
  $i=0;

  return $i;
  $i = 1;
  echo $i."\n";
}
test();
var_dump(test);

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

另外提供了一些流程控制的替代语法,包括 ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 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看看效果吧

<?php
function zhuge(){
echo "qaforcode.net";
}
?>

 

<?php
include(dirname(__FILE__)."/a.php");
test();
?>

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

<?php
echo "我是文件a!\n";
echo "include_once\n";include_once("b.php");
echo "include_once\n";include_once("b.php");
echo "include\n";include("b.php");
echo "文件a结束了\n";
?>

 

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

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

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

该日志由 趴在树上的猪 于2012年11月14日发表在 php 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 流程控制 | 猪哥每日一贴
关键字:
【上一篇】
【下一篇】

流程控制:目前有1 条留言

  1. 沙发
    OMG:

    好料,得多看几遍,多练习几遍才能懂…

    2012-11-30 下午 4:20 [回复]

发表评论


快捷键:Ctrl+Enter

浙公网安备 33010602001905号