0Pricing
PHP Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. if、elseif 与 else
  2. Switch 与 Match 语句
  3. for 与 while 循环
  4. foreach 与循环控制
← 返回 PHP Academy