Switch 与 Match 语句
使用 switch 和 PHP 8 的 match 实现多分支逻辑。
Switch 与 Match 语句 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
switch 与 if 链
当您需要根据单个变量的值设置许多分支时,switch 比冗长的 if/elseif 链更简洁。
PHP 8 引入了 match,作为现代且严格的替代方案。
switch 语句基础
switch 只对表达式求值一次,然后执行匹配的 case 代码块:
<?php
$day = 'Monday';
switch ($day) {
case 'Monday':
echo 'Start of work week';
break;
case 'Friday':
echo 'Almost weekend';
break;
default:
echo 'Midweek';
}贯穿执行行为
如果没有 break,执行会贯穿到下一个 case。这是一种有意将多个情况分组的技巧:
<?php
$status = 2;
switch ($status) {
case 1:
case 2:
case 3:
echo 'In progress'; // runs for 1, 2, or 3
break;
case 4:
echo 'Done';
break;
}switch 使用宽松比较
switch 内部使用 ==(宽松比较),这可能导致出人意料的匹配结果:
<?php
$val = 0;
switch ($val) {
case 'foo': // 0 == 'foo' in PHP 7!
echo 'match foo';
break;
case 0:
echo 'match zero'; // PHP 8 fixes this
break;
}
// PHP 8: match zero (fixed)
// PHP 7: match foo (bug!)PHP 8 的 match 表达式
match 类似于 switch,但使用严格比较、返回一个值,并且不需要 break:
<?php
$status = 'active';
$label = match($status) {
'active' => 'Currently active',
'inactive' => 'Not active',
'pending' => 'Awaiting activation',
default => 'Unknown status',
};
echo $label; // Currently active没有匹配项时的 match 异常
如果 match 中没有分支匹配,且没有 default,就会抛出 UnhandledMatchError:
<?php
$code = 99;
try {
$result = match($code) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
// no default!
};
} catch (\UnhandledMatchError $e) {
echo 'Unhandled match value: ' . $code;
}带多个条件的 match
单个 match 分支可以列出多个以逗号分隔的值:
<?php
$lang = 'tr';
$region = match($lang) {
'en', 'en-US', 'en-GB' => 'English',
'tr', 'az' => 'Turkic',
'fr', 'be', 'ca' => 'French-speaking',
default => 'Other',
};
echo $region; // Turkic带复杂表达式的 match
match 分支的右侧可以使用任意表达式:
<?php
$score = 85;
$grade = match(true) {
$score >= 90 => 'A',
$score >= 80 => 'B', // matches
$score >= 70 => 'C',
default => 'F',
};
echo $grade; // B从 match 返回
由于 match 是一个表达式,因此可以在任何需要值的地方使用:
<?php
function getHttpMessage(int $code): string {
return match($code) {
200 => 'OK',
201 => 'Created',
400 => 'Bad Request',
401 => 'Unauthorized',
404 => 'Not Found',
default => 'Unknown',
};
}
echo getHttpMessage(404); // Not Found返回环境中的 switch
switch 可以在函数中使用,以返回不同的值,但 match 更简洁:
<?php
function describe(int $n): string {
switch (true) {
case $n < 0: return 'negative';
case $n === 0: return 'zero';
default: return 'positive';
}
}
echo describe(-5); // negative
echo describe(0); // zero
echo describe(7); // positive何时使用 switch 与 match
选择时可以遵循以下准则:
- 需要严格比较和返回值时使用
match(PHP 8 及更高版本) - 需要贯穿分组,或需要支持 PHP 7 时使用
switch - 对于多值分支,两者都比冗长的 if/elseif 链更简洁
快速检查
在 match 表达式中,如果没有分支匹配且没有 default,会发生什么?
回顾:switch 和 match
主要区别:
switch—— 宽松比较、贯穿执行、PHP 4 及更高版本match—— 严格比较、不贯穿执行、返回值、PHP 8 及更高版本- 没有 default 时,match 会抛出
UnhandledMatchError - match 分支可以接受多个以逗号分隔的值
下一步:for 和 while 循环。
常见问题解答
「Switch 与 Match 语句」课时是免费的吗?
是的 — 「Switch 与 Match 语句」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「Switch 与 Match 语句」这节课中我会学到什么?
使用 switch 和 PHP 8 的 match 实现多分支逻辑。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Switch 与 Match 语句」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- if、elseif 与 else
- Switch 与 Match 语句
- for 与 while 循环
- foreach 与循环控制