分支结构
php
<?php
$n = 5;
if ($n > 10) {
echo "大于";
}php
<?php
$n = 5;
if ($n > 10) {
echo "大于";
} else {
echo "小于";
}
// 三元
echo $n > 10 ? "大于": "小于";php
<?php
// if elseif else
$n = 5;
if ($n > 10) {
echo "大于10";
} else if($n > 8) {
echo "小于8";
} else {
echo "既不大于 10 也不大于 8"
}
// switch
switch($n) {
case $n>10:
echo "greater than 10";
break;
case $n>8:
echo "greater than 10";
default:
echo "less than 8 and 10";
}循环结构
这两个关键字都是有的, 而且作用和 C 是一样的
- continue
- break
php
<?php
for ($i = 0; $i < 5; $i++) {
echo "{$i}<br/>";
}php
<?php
$i = 0;
while ($i < 5) {
// 依次输出: 0,1,2,3,4
echo "i = {$i}<br/>";
$i += 1;
}
$j = 0;
do {
// 依次输出: 0,1,2,3,4
echo "j = {$j} <br/>";
$j += 1;
} while ($j < 5);php
<?php
$arr = ["1", "2", "3", "4", "5"];
# 获取数组元素的下标和值
foreach ($arr as $key => $val) {
// 输出:
// 0: 1
// 1: 2
// 2: 3
// 3: 4
// 4: 5
echo "{$key}: {$val}<br/>";
}
# 仅仅获取数组元素的值
foreach ($arr as $val) {
// 输出:
// value: 0
// value: 1
// value: 2
// value: 3
// value: 4
echo "value: {$val}<br/>";
}PHP 8 新语法: match
Rust: 你怎么肉眼可见的 "锈化了" 🤣
php
<?php
$fruit = "apple";
// 1.类似 switch 语句
// default: 表示匹配其他所有值
// 作用相当于 switch 语句中的 default
$res1 = match ($fruit) {
"banana" => "is banana",
"apple" => "is apple",
default => "is unknown fruit"
}; // 注意: 这是一个表达式, 所以行末必须加 ; 结尾
echo $res1; // is apple
echo "<br/>";
// 2.使用match必须要穷尽所有可能的值, 否则报错
$n = 10;
$res2 = match ($n) {
$n > 20 => "greater than 20",
$n == 20 => "equal to 20",
default => "unknown number"
// 不加 default 这行就报错: 因为 $n 可能小于10, 让上面两个表达式无法成立
// 报错信息如下:
// Fatal error: Uncaught UnhandledMatchError: Unhandled match case 10
};
echo $res2; // unknown number
echo "<br/>";
// 3.与switch语句的不同
// match 匹配的是表达是的结果, 而不是表达式是否返回 true
$res3 = "";
switch ($n) {
case $n > 20:
$res3 = "greater than 20";
break;
case $n == 20:
$res3 = "equal to 20";
break;
case $n < 20:
$res3 = "less than 20";
break;
default:
$res3 = "unknown number";
};
echo $res3; // less than 20
echo "<br/>";
$res4 = match ($n) {
$n > 20 => "greater than 20",
$n == 20 => "equal to 20",
$n < 20 => "less than 20",
default => "unknown number"
};
echo $res4; // unknown number
echo "<br/>";
/*
为什么会这样?
因为: match 匹配的是表达式的结果, 而不是表达式的值是否为真
$res4 = match ($n) {
$n > 20 => "greater than 20", 表达式结果 false, false === 10 吗? 不等,所以不匹配
$n == 20 => "equal to 20", 表达式结果 false,
$n < 20 => "less than 20", 表达式结果 true, true === 10 吗? 不等,所以也不匹配
default => "unknown number" 不管表达式返回什么, 只要什么没有匹配到,就会走这个默认的值
}
还有一个小细节:
由于 match 表达式, 必须要穷尽所有可能的值, 否则报错
如果 $res4 = match 这个表达式, 如果去掉 default 就会报错
因为如果没有 default, 那么就没有穷尽所有可能的值:
因为上面三个表达式的结果都不能匹配到 10 这个值
--------------------------------------------------------
如果想要 $res4 = match 这个表达式的效果和 switch
语句的效果一样, 可以这样做: 去匹配 true, 而不是匹配 $n 的值
因为任意两个数字对比大小: 只能有3种结果, 大于/小于/等于
$res5 = match (true) {
$n > 20 => "greater than 20", 表达式结果 false, false === true 吗? 不等,所以不匹配
$n == 20 => "equal to 20", 表达式结果 false,
$n < 20 => "less than 20", 表达式结果 true, true === true 吗? 相等,所以匹配到了
}
echo $res5; // less than 20
*/
$res5 = match (true) {
$n > 20 => "greater than 20",
$n == 20 => "equal to 20",
$n < 20 => "less than 20",
};
echo $res5; // less than 20
echo "<br/>";