PHP匹配表达式怎么用

wen PHP项目 3

本文目录导读:

PHP匹配表达式怎么用

  1. 基本语法
  2. 简单示例
  3. 多条件匹配(用逗号分隔)
  4. 条件表达式
  5. 严格比较
  6. 无 default 时的异常
  7. 实际应用示例
  8. Match vs Switch 对比表
  9. 最佳实践

PHP 的匹配表达式(Match Expression)是 PHP 8.0 引入的一项新特性,类似于 switch 语句但更简洁和安全,我来详细讲解一下:

基本语法

$result = match ($expression) {
    condition1 => value1,
    condition2 => value2,
    default => value_default,
};

简单示例

$status = 200;
$message = match ($status) {
    200 => 'OK',
    404 => 'Not Found',
    500 => 'Server Error',
    default => 'Unknown Status',
};
echo $message; // 输出: OK

多条件匹配(用逗号分隔)

$grade = 'B';
$remark = match ($grade) {
    'A', 'B' => 'Excellent',
    'C', 'D' => 'Pass',
    'F' => 'Fail',
    default => 'Invalid Grade',
};
echo $remark; // 输出: Excellent

条件表达式

$score = 85;
$result = match (true) {
    $score >= 90 => 'A',
    $score >= 80 => 'B',
    $score >= 70 => 'C',
    $score >= 60 => 'D',
    default => 'F',
};
echo $result; // 输出: B

严格比较

match 使用严格比较(),而 switch 使用松散比较():

$value = "1"; // 字符串
$result = match ($value) {
    1 => 'integer one',
    "1" => 'string one',
    default => 'other',
};
// 输出: string one
// 如果用 switch
switch ($value) {
    case 1:
        echo 'integer one'; // 会匹配这个
        break;
}

无 default 时的异常

如果不匹配任何条件且没有 default,会抛出 UnhandledMatchError

$value = 10;
try {
    $result = match ($value) {
        1 => 'one',
        2 => 'two',
    };
} catch (UnhandledMatchError $e) {
    echo '未匹配到任何值';
}

实际应用示例

路由处理

$route = '/users';
$controller = match ($route) {
    '/home' => 'HomeController',
    '/users' => 'UserController',
    '/admin' => 'AdminController',
    default => 'PageNotFoundController',
};

类型判断

function getTypeLabel(mixed $data): string {
    return match (true) {
        is_string($data) => '字符串',
        is_int($data) => '整数',
        is_float($data) => '浮点数',
        is_bool($data) => '布尔值',
        is_null($data) => 'NULL',
        is_array($data) => '数组',
        is_object($data) => '对象',
        default => '未知类型',
    };
}
echo getTypeLabel([1,2,3]); // 数组

月份天数

function daysInMonth(int $month): int {
    return match($month) {
        2 => 28,
        4, 6, 9, 11 => 30,
        1, 3, 5, 7, 8, 10, 12 => 31,
        default => throw new InvalidArgumentException('无效月份'),
    };
}

Match vs Switch 对比表

特性 Switch Match
比较方式 松散比较 (==) 严格比较 (===)
返回值 需要 break 自动返回
表达式结果 无返回值 有返回值
简写语法 不支持 支持箭头 =>
无匹配时 继续执行 抛异常(无default时)
多条件 需要多个case 逗号分隔即可

最佳实践

  1. 优先使用 match:当需要返回值时,match 更简洁
  2. 始终添加 default:避免未预期的错误
  3. 利用严格比较:避免类型转换带来的问题
  4. 适用于常量比较:不适合复杂逻辑判断
// 正确用法
$category = match($type) {
    'a' => 'Category A',
    'b' => 'Category B',
    default => 'Uncategorized',
};
// 避免复杂逻辑
// 复杂逻辑应该用 if-elseif-else
if ($x > 10 && $y < 20) {
    // 复杂条件判断
} elseif ($x === 5 && $y === 6) {
    // 另一种情况
}

Match 表达式让代码更简洁、可读性更好,是现代 PHP 推荐的写法!

抱歉,评论功能暂时关闭!