PHP流程控制小梳理

梳理, 温习关于PHP流程控制的一些小知识

判断

if

这个比较好理解,示例:

1
2
3
4
5
6
7
8
9
<?php
if ($a > $b) {
echo "a is bigger than b";
} elseif ($a == $b) {
echo "a is equal to b";
} else {
echo "a is smaller than b";
}
?>
switch

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}

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

switch-case 规范请参考 PSR switch-case

循环

for

PHP 中最复杂的循环结构。
语法:

1
2
for (expr1; expr2; expr3)
statement

描述:

  • expr1 会在循环前无条件执行一次,你可以视为执行循环初始化的表达式。
  • expr2 会在每次循环前执行,如果返回true,则执行statement,否则跳出循环。
  • expr3 会在执行statement之后执行一次。
  • statement 循环体

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
echo $i;
}

/* example 2 */
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i;
}

/* example 3 */
$i = 1;
for (;;) {
if ($i > 10) {
break;
}
echo $i;
$i++;
}

/* example 4 */
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>
foreach

遍历数组的简单方式。

foreach 仅能够应用于数组和对象

语法:

1
2
3
4
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
class Counter {
public $counter = 0;
protected $counte2r = 1;
private $counte22r = 2;

public function increase()
{
$this->counter++;
}

public function print()
{
return $this->counter;
}
}

$obj = new Counter;
foreach($obj as $k => $a) {
var_dump($k, $a);
}
$array = [
[1, 2],
[3, 4],
];

foreach ($array as $k => list($a)) {
echo "$k" . PHP_EOL;
echo "$a" . PHP_EOL;
}
?>
while

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

1
2
while (expr)
statement

while 语句的含意很简单,它告诉 PHP 只要 while 表达式(即expr)的值为 true 就重复执行嵌套中的循环语句。
示例:

1
2
3
4
5
6
7
8
9
<?php
$created = false;
echo 'start' . PHP_EOL;
while (empty($created)) {
echo 'execute' . PHP_EOL;
$created = rand(0, 1) ? true: false;
}
echo 'end' . PHP_EOL;
?>
do-while

个人认为:do-while 循环是 PHP 中第二简单的循环类型。
语法:

1
2
do statement
while(expr)

不同于 while 的是,他的循环体在执行判断表达式 expr (返回 false 跳出循环,返回 true 则继续执行循环体)之前。
示例:

1
2
3
4
5
6
7
8
9
<?php
$created = false;
echo 'start' . PHP_EOL;
do {
echo 'execute' . PHP_EOL;
$created = rand(0, 1) ? true: false;
} while (empty($created));
echo 'end' . PHP_EOL;
?>

跳出循环

break

break 结束当前 for,foreach,while,do-while 或者 switch 结构的执行。
break 可以接受一个可选的数字参数来决定 跳出 几重循环。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$created = false;
$a = [2, 3];
echo 'start' . PHP_EOL;
do {
echo 'execute' . PHP_EOL;
foreach($a as $k => $v) {
$number = rand(0, 1);
if ($number) {
break 2; // 跳出第二层循环 - do-while
} else {
break; // 跳出本层循环 - foreach
}
}
$created = rand(0, 1) ? true: false;
if ($created) break; // 跳出本层循环 - do-while
} while (empty($created));
echo 'end' . PHP_EOL;
?>
continue

continue 跳过本次循环的执行。
continue 可以接受一个可选的数字参数来决定 跳过 几重循环。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$a = [2, 3, 5, 6];
echo 'start' . PHP_EOL;
$index = 0;
$length = count($a);
while ($index < $length) {
echo "execute ${a[$index]}" . PHP_EOL;
$number = rand(0, 1);
if ($number) {
continue 2; // 跳过两重循环
} else {
continue; // 跳过一重循环
}
$index ++;
}
echo 'end' . PHP_EOL;
?>

try-catch

这个配合MySQL的事务处理一级棒!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
// start mysql transaction
try {
$first = rand(0, 1);
$second = rand(0, 1);
if ($first > $second) {
throw new Exception('Throw an exception here');
}
if ($first === $second) {
// commit mysql transaction
echo "It's normal!" . PHP_EOL;
}
if ($first < $second) {
throw new Error('Throw an error here');
}
} catch (\Error $error) {
// rollback mysql transaction
throw $error;
} catch (\Exception $exception) {
// rollback mysql transaction
throw $exception;
} finally {
echo 'finally!' . PHP_EOL;
}
// or you can use 'catch(\Throwable $previous)' to catch Error and Exception in PHP 7
?>

enjoy and happy coding!