在PHP 8.0及之后的版本中,引入了match表达式,它是一种更简洁、更强大的条件判断结构,可视为switch语句的升级版。下面为你详细介绍它的语法、特性以及与switch的差异。

一、基础语法

$result = match (表达式) {
    静态值1 => 返回值1,           // ✅ 正确:左侧为静态值
    静态值2, 静态值3 => 返回值2,  // ✅ 多个静态值合并
    表达式/函数调用 => 返回值4,
    default => 默认返回值,
};

关键点

  1. 直接返回值match是表达式,而非语句,可直接赋值给变量。
  2. 严格比较:使用===进行值的比较,需类型和值都一致。
  3. 无需break:每个条件后无需中断,不会自动向下穿透。
  4. 支持表达式:匹配条件可以是变量、表达式或函数调用。

二、使用示例

1. 简单值匹配

$num = 2;
$result = match ($num) {
    1 => '一',
    2 => '二',
    3 => '三',
    default => '其他',
};
// $result = '二'

2. 多条件合并

$day = 'Saturday';
$result = match ($day) {
    'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' => '工作日',
    'Saturday', 'Sunday' => '周末',
    default => '无效日期',
};
// $result = '周末'

3. 表达式匹配

$age = 25;
$result = match (true) {
    $age < 18 => '未成年人',
    $age >= 18 && $age < 60 => '成年人',
    default => '老年人',
};
// $result = '成年人'

4. 函数返回值匹配

function getStatusCode() {
    return 404;
}

$result = match (getStatusCode()) {
    200 => '成功',
    404 => '未找到',
    500 => '服务器错误',
    default => '其他错误',
};
// $result = '未找到'

三、与switch的核心差异

特性matchswitch
比较方式严格比较 (===)宽松比较 (==)
是否返回值是(表达式)否(语句)
是否需要break否(不会穿透)是(默认穿透)
支持表达式作为条件
示例$x = match (1) { 1 => 'a' };switch (1) { case 1: echo 'a'; }

四、高级用法

1. 类型匹配(结合instanceof

$obj = new DateTime();
$result = match (true) {
    $obj instanceof DateTime => '日期对象',
    is_array($obj) => '数组',
    default => '其他类型',
};
// $result = '日期对象'

2. 常量和字符串匹配

const APP_ENV = 'prod';
$result = match (APP_ENV) {
    'dev' => '开发环境',
    'test' => '测试环境',
    'prod' => '生产环境',
    default => '未知环境',
};
// $result = '生产环境'

五、注意事项

match 比较分支值,使用了严格比较 (===), 而 switch 语句使用了松散比较。
match 表达式会返回一个值。
match 的分支不会像 switch 语句一样, 落空时执行下个 case。
match 表达式必须彻底列举所有情况。

  1. 必须覆盖所有可能的值:若未提供default分支,且匹配失败,会抛出UnhandledMatchError异常。

    $x = 4;
    $result = match ($x) { // 缺少default,会报错
        1 => '一',
        2 => '二',
    };

六、兼容性

match表达式从PHP 8.0开始支持,若使用的是PHP 7.x及以下版本,需改用switch语句或其他替代方案。

总结

match表达式通过更简洁的语法、严格比较和直接返回值的特性,提升了代码的可读性和安全性,尤其适合复杂的条件判断场景。不过,在使用时要注意覆盖所有可能的情况,并了解它与switch的差异。

标签: none

添加新评论