Loading

php match表达式如何使用?

PHP 8.0 引入了 match 表达式,它是一种更简洁、更强大的条件分支结构,可以看作是 switch 语句的增强版。

基本语法

$result = match (subject_expression) {
    pattern1 => result1,
    pattern2 => result2,
    // ...
    default => default_result,
};

与 switch 的对比

switch 语句

$status = 404;
$message = '';

switch ($status) {
    case 200:
        $message = 'OK';
        break;
    case 404:
        $message = 'Not Found';
        break;
    default:
        $message = 'Unknown';
        break;
}

echo $message; // 输出: Not Found

match 表达式

$status = 404;
$message = match ($status) {
    200 => 'OK',
    404 => 'Not Found',
    default => 'Unknown',
};

echo $message; // 输出: Not Found

match 表达式的特性

1. 返回值

match 是一个表达式,会返回匹配分支的值:

$result = match (true) {
    2 > 1 => '条件成立',
    default => '条件不成立',
};
echo $result; // 输出: 条件成立

2. 严格类型比较

match 使用 === 进行比较:

$value = "1";

// switch 使用松散比较
switch ($value) {
    case 1: // 这里会匹配,因为 "1" == 1
        echo "switch: 匹配数字 1";
        break;
}

// match 使用严格比较
echo match ($value) {
    1 => "match: 匹配数字 1",    // 不会匹配,因为 "1" !== 1
    "1" => "match: 匹配字符串 1", // 这里匹配
    default => "未匹配"
};

3. 多个条件匹配同一个结果

$httpCode = 404;

$message = match ($httpCode) {
    200, 201 => '成功',
    400, 401, 403 => '客户端错误',
    404, 500 => '服务器错误',
    default => '未知状态码'
};

echo $message; // 输出: 服务器错误

4. 条件表达式作为模式

$age = 25;

$category = match (true) {
    $age < 13 => '儿童',
    $age < 20 => '青少年',
    $age < 65 => '成年人',
    default => '老年人'
};

echo $category; // 输出: 成年人

5. 复杂的返回值

$userType = 'admin';

$permissions = match ($userType) {
    'admin' => ['read', 'write', 'delete'],
    'editor' => ['read', 'write'],
    'viewer' => ['read'],
    default => []
};

print_r($permissions); // 输出: Array ( [0] => read [1] => write [2] => delete )

高级用法

嵌套 match

$status = 404;
$method = 'GET';

$response = match ($status) {
    200 => match ($method) {
        'GET' => '数据获取成功',
        'POST' => '数据创建成功',
        default => '操作成功'
    },
    404 => '资源未找到',
    default => '未知错误'
};

echo $response; // 输出: 资源未找到

在函数中使用

function getSeason($month) {
    return match ($month) {
        12, 1, 2 => '冬季',
        3, 4, 5 => '春季',
        6, 7, 8 => '夏季',
        9, 10, 11 => '秋季',
        default => throw new InvalidArgumentException("无效的月份: $month")
    };
}

echo getSeason(3); // 输出: 春季

与 throw 结合

$operation = 'invalid';

try {
    $result = match ($operation) {
        'add' => $a + $b,
        'subtract' => $a - $b,
        default => throw new InvalidArgumentException("无效的操作: $operation")
    };
} catch (InvalidArgumentException $e) {
    echo $e->getMessage(); // 输出: 无效的操作: invalid
}

注意事项

1. 必须穷尽所有情况 或提供 default 分支

// 这会抛出 UnhandledMatchError
$value = 5;
$result = match ($value) {
    1 => '一',
    2 => '二'
};

// 正确的写法
$result = match ($value) {
    1 => '一',
    2 => '二',
    default => '其他'
};

2. 分支不允许落空(不需要 break)

// 每个分支都会返回一个值,不会继续执行下一个分支
$value = 1;
$result = match ($value) {
    1 => '第一个分支',
    1 => '第二个分支', // 这永远不会执行
    default => '默认'
};

3. 支持任意表达式作为返回值

$config = match ($environment) {
    'dev' => require 'config/dev.php',
    'prod' => require 'config/prod.php',
    default => require 'config/default.php'
};

性能优势

match 表达式通常比 switch 语句性能更好,因为:

  • 编译时优化更好

  • 不需要 break 语句

  • 使用哈希表进行快速查找

总结

match 表达式提供了:

  • 更简洁的语法

  • ✅ 返回值能力

  • 严格类型比较

  • ✅ 更好的性能

  • ✅ 更安全的执行(不会意外落空)

它是现代 PHP 开发中处理多条件分支的推荐方式。

posted @ 2025-10-14 16:37  Carvers  阅读(14)  评论(0)    收藏  举报