order

顺序结构

在前面的所有课程的示例中,大部分都是以顺序结构展示的。所谓顺序结构,就是按照你所书写的代码 从上到下依次 线性执行,没有任何步骤所言。但是如果某种语言只有这样的一种执行方式,那可以说这个语言没有用处,更别提什么设计流程了。类似于赋值、输入,打印等语句都属于顺序结构语句,概念都很简单,这里不再赘述。

branch

分支结构

分支结控制了整个程序的流程,可以做出先判断,再决定执行什么样的代码。相对于顺序结构,他不再按照代码的物理排序的顺序执行,而是有了一定的选择性。

在 PHP 或是所有编程语言中,都包含四种常用的分支结构。他们分别是 单一条件双向条件多项条件嵌套条件 分支结构。他们都会依据你指定的条件来选择程序执行路径;满足则执行,不满足则执行另一个条件。最终返回结果。下面我将依次介绍这几种分支条件的使用方式。

单一条件

想必大家对 if 语句并不陌生吧,单个的 if () 就是单一条件,这对于包括 PHP 在内的很多语言来说都是最基础最重要的流程控制语句。

用法也是很简单,在 if () 的括号里写上一个可以返回 布尔值 的输出语句,即可控制程序的流程方向。


if (3 > 2)
    echo '3是大于2的';
		

如果你想在一个判断里执行多个语句,就需要用一对大括号 {} 将他们包裹起来,像这样:


$birthday = '0218';
if (date('md') === $birthday) {
    echo '妈诶 女朋友过生日了';
    // 伪代码
    buyGift();
    writeCard();
    giveKiss();
    # other things
}
		

怎么样,是不是很简单很好理解。

双向条件

if () 遇到了 else 之后,就产生了 双向条件 。也就是说,当 if () 里的条件不满足时,将会跳转到 else 这个分支里执行相应代码。像这样:


$status = '清醒';
if ($status != '清醒') {
    echo '女朋友过生日我送什么礼物好呢';
} else {
    echo '我根本没有女朋友';
}
echo '洗洗睡吧';
		

如果你的不是清醒的状态,就会输出“女朋友过生日我送什么礼物好呢”反之就会输出“我根本没有女朋友”。但是不管怎么执行,最后那句“洗洗睡吧”一直会按照 顺序结构 执行。

多向条件

elseif 语句

if () 遇到了一个或多个 elseif () 之后,就构成了 多向条件。在 PHP 中, elseif() 也可以写成 else if(),他们的意思是一样的。


$money = 300;
if ($money <= 100) {
    echo '看电影';
} else if ($money > 100 && $money <= 500) {
    echo '买口红';
} else if ($money > 500 && $money <= 1000) {
    echo '买化妆品套装';
} else {
    // 如果上述条件都不满足
    echo '为所欲为';
}
# do other things...
		

上述示例运行结果会输出:“买口红”,不难看出,像 if ... else if ... else 这样的语句,只要不满足某个条件,就会一次判断每一个 else if() 中的条件,直到满足。并且执行满足条件中的代码后,不会再继续判断后面 else if() 中的条件。

如果我的 $money = 1500,那就会输出“为所欲为”,因为它每一个条件都不满足,所以执行了最后的 else 语句。所以在日常开发中,这种多向条件的判断结构适合对一个变量进行范围的判断。比如判断一天的时间是上午、中午还是下午...

switch 语句

还有一个和 if else() 意义差不多的语句: switch 语句。它也是一种多向条件分支结构。不同的是, ifelse if 使用的是判断语句表达式或布尔值,而 switch 是测试一个表达式的值,并根据结果执行不同的分支。下面,我将用 switch 和 if 做一个对比:


if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}
		

上面的代码如果用 switch 来实现,就是一下代码:


switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}
		

为避免错误,理解 switch 是怎样执行的非常重要。switch 语句一行接一行地执行(实际上是语句接语句)。开始时没有代码被执行。仅当一个 case 语句中的值和 switch 表达式的值匹配时 PHP 才开始执行语句,直到 switch 的程序段结束或者遇到第一个 break 语句为止。如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。例如:


switch ($i) {
    case 0:
        echo "i equals 0";
    case 1:
        echo "i equals 1";
    case 2:
        echo "i equals 2";
}
		

没有了 break,当 $i 等于 0 时,就会把 0,1,2 三个语句都执行,输出三句话;当 $i 等于 1 时,就会把 1,2 三个语句都执行,输出两句话... 以此类推。所以,别忘了加上 break 语句。

在一个 case 中的语句也可以为空,这样只不过将控制转移到了下一个 case 中的语句,这相当于在 if 语句中的 || (或),比如,用 if 这样写:


if ($name == "A" || $name == "B" || $name == "C") {
    echo 'They are A and B and C';
} else if ($name == "D") {
    echo 'This is D';
}
		

switch 就可以这样写:


switch ($name) {
    case 'A':
    case 'B':
    case 'C':
        echo "They are A and B and C";
    case 'D':
        echo "This is D";
        break;
}
		

还记得 if else 中最后一个 else 吗,当所有条件都不满足时,会执行最后一个 else 中的代码。在 switch 中它叫 default,它匹配了任何和其它 case 都不匹配的情况,默认可以省略不写:


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 is not equal to 0, 1 or 2";
        break;
}
		

你也可以使用分号代替 case 语句后的冒号,例如:


switch($beer)
{
    case 'tuborg';
    case 'carlsberg';
    case 'heineken';
        echo 'Good choice';
    break;
    default;
        echo 'Please make a new selection...';
    break;
}
		

嵌套条件

嵌套条件其实就是在 if 语句中包含一个或多个 if 语句,其实不是很建议使用这种嵌套结构,因为一旦眼花,就很容易出错,有时候连自己都会被绕晕。。。

举个例子,某个药品的使用规则是,任何人都可以服用,但是男女使用剂量不同。当然,如果没有病,也不需要使用这个药品,用代码来描述就是:


if ($sex == 'man') {
    if ($is_sick === true) {
        echo "使用剂量为 12 μg";
    } else {
        echo "不需要使用该药品";
    }
} else {
    // 性别为女
    if ($is_sick === true) {
        echo "使用剂量为 6 μg";
    } else {
        echo "不需要使用该药品";
    }
}
		

之所以不建议使用嵌套条件,是因为大部分的嵌套条件是可以简化书写的,读起来不会很吃力。比如上述代码可以修改为:


if (!$is_sick) {
    echo "不需要使用该药品";
} else {
    if ($sex == 'man') {
        echo "使用剂量为 12 μg";
    } else {
        echo "使用剂量为 6 μg";
    }
}
		

最后,在写一些比较复杂的流程控制代码时,可以先自己画一下流程图。不要着急写代码,经验告诉我,有所准备的代码修改量比上来就写的代码少的多得多。

以上就是 PHP 的流程控制语句。

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~