PHP 流程控制

流程控制就是控制程序运行顺序的指令,如条件、循环。


if

if 按照条件执行代码片段,语法:

<?php
if (表达式)
  语句

判断表达式的布尔值,其他类型的值将自动转换为布尔值,例子:

<?php
$a = 2;
$b = 1;
if ($a > $b)
  echo "a 大于 b";

else

在不满足该条件时执行其它语句。

<?php
if ($a > $b) {
  echo "a 大于 b";
} else {
  echo "a 不大于 b";
}

elseif/else if

elseif / else if 语句加强了 if 语句,可以在 if 表达式值为 false 时执行不同语句。

<?php
if ($a > $b) {
    echo "a 大于 b";
} elseif ($a == $b) {
    echo "a 等于 b";
} else {
    echo "a 小于 b";
}

while

while循环是 PHP 中最简单的循环类型,语法:

while (表达式)
    语句

只要 while 表达式的值为 true, 就重复执行嵌套中的循环语句。

<?php

$i = 1;
while ($i <= 10) {
    echo $i++;  // 输出1-10
}

do-while

和 while 循环主要的区别是, do-while 的循环语句保证会执行一次(在每次循环结束后检查表达式的真值)。

<?php
$i = 0;
do {
   echo $i;    // 输出0
} while ($i > 0);

for

for 循环是 PHP 中常用的循环结构,语法:

for (表达式1; 表达式2; 表达式3)
    语句

表达式1 在循环开始前无条件执行一次。

表达式2 在每次循环开始前求值,当值为 false时终止循环。

表达式3 在每次循环之后被执行。

<?php
for ($i = 1; $i <= 10; $i++) {
    echo $i;    // 输出1-10
}

foreach

foreach 语法结构是遍历数组的简单方式,它有两种语法:

// 语法1
foreach (数组 as $value)
    语句
// 语法2
foreach (数组 as $key => $value)
    语句

第一种格式遍历给定的数组,每次循环中,当前元素的值被赋给变量 $value。

第二种格式做同样的事,并把当前单元的键也会赋给变量 $key。

<?php
$arr = [1, 2, 3, 4];
$sum = 0;
foreach ($arr as $value) {
    $sum = $sum + $value ;
}
echo $sum;    // 数组求和,输出10

可以很容易地通过在 $value 之前加上 & 来修改数组的元素。

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}

break

break 用于跳出循环,可以结束 for,foreach,while,do-while 或者 switch 结构的执行。

<?php
$arr = ['one', 'two', 'three', 'four', 'stop', 'five'];
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;
    }
    echo "$val<br />\n";
}

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

<?php
$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br />\n";
        break 1;  /* 只退出 switch. */
    case 10:
        echo "At 10; quitting<br />\n";
        break 2;  /* 退出 switch 和 while 循环 */
    default:
        break;
    }
}

continue

continue 在循环结构用用来跳过本次循环中剩余的代码,并在条件求值为真时开始执行下一次循环。

<?php
for ($i = 0; $i < 5; ++$i) {
    if ($i == 2)
        continue;
    echo "$i ";    // 0 1 3 4
}

switch

switch 语句类似于具有同一个表达式的一系列 if 语句。

注意:

1、switch/case 作的是松散比较;

2、如果不在 case 的语句段最后写上 break 的话,PHP 将继续执行下一个 case 中的语句段。

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

一个 case 的特例是 default,它匹配了任何和其它 case 都不匹配的情况。

<?php
$i = 3;
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";
}

match

match 从 PHP 8.0.0 开始可用。

match 和 switch 类似,但不同的是,match 作的是严格比较 (===),switch作的是松散比较 (==)。

<?php
$condition = '1';
$expressionResult = match ($condition) {
    1, 2 => foo(),
    3, 4 => bar(),
    default => baz(), // 由于 match 作的是严格比较 (===),baz()将被执行,其结果作为 match 的返回值。
};

return

return 将程序控制返还给调用者。

<?php
function plusOne($num) {
    return $num + 1;
}

include

包含并运行指定文件,如果未找到文件则 include 会发出一条警告。

vars.php

<?php

$color = 'green';
$fruit = 'apple';

test.php

<?php

echo "A $color $fruit"; // 输出A

include 'vars.php';

echo "A $color $fruit"; // 输出A green apple

require

require 和 include 几乎完全一样,但是 require 在出错时产生 E_COMPILE_ERROR 级别的错误,将导致脚本中止; include 只产生警告(E_WARNING),脚本会继续运行。


include_once

include_once 和 include 类似,区别是 include_once 会检查该文件是否已经被包含过,如果是则不会再次包含。


require_once

require_once 和 require 类似,区别是 require_once 会检查该文件是否已经被包含过,如果是则不会再次包含。


goto(不建议使用,会令程序可读性变差)

goto 可以用来跳转到程序中的另一位置。目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。

<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';

以上例程会输出:

Bar