简介
PHP 8 引入了 match() 表达式,用来替代传统的 switch 语句,提供更简洁、更安全的方式进行条件匹配。与 switch 不同,match() 是一个表达式,它会返回值,并且使用 严格比较(===)。
基本语法
php
$result = match (表达式) {
值1 => 结果1,
值2 => 结果2,
值3, 值4 => 结果3, // 多个值匹配同一个结果
default => 默认结果
};
match() 直接返回值,并且必须匹配到一个值,否则会抛出 UnhandledMatchError。
match() VS switch()
| 特性 | switch | match |
|---|---|---|
| 语法 | 需要 case 和 break |
直接使用 => |
| 比较方式 | 宽松比较 (==) |
严格比较 (===) |
| 返回值 | 需要 return |
直接返回值 |
fall-through |
可能(如果缺少 break) |
不会(默认不会执行下一个 case) |
| 未匹配情况 | 不会抛异常 | 会抛异常 |
match() 的基本用法
基本示例
php
$number = 2;
$result = match ($number) {
1 => 'One',
2 => 'Two',
3 => 'Three',
default => 'Unknown'
};
echo $result; // 输出 "Two"
-
match()自动返回值,不需要return -
严格比较,
2 == "2"在switch里会匹配,但在match()里不会
多个值匹配同一个结果
php
$fruit = "apple";
$color = match ($fruit) {
"apple", "cherry", "strawberry" => "red",
"banana", "lemon" => "yellow",
"grape", "blueberry" => "purple",
default => "unknown"
};
echo $color; // 输出 "red"
- 可以在
match()的 单个case里写多个匹配值
严格比较 (===)
php
$value = "2";
$result = match ($value) {
2 => "Matched as integer",
"2" => "Matched as string",
default => "No match"
};
echo $result; // 输出 "Matched as string"
match()严格比较 (===),不会把"2"误认为2。
变量匹配
php
$input = 100;
$result = match ($input) {
$a = 10 => "Ten",
$b = 100 => "Hundred",
default => "Other"
};
echo $result; // 输出 "Hundred"
match()支持 变量赋值($a = 10),但是$a不能在match()外使用。
match() 结合表达式
match() 结合函数
php
function getCategory(string $food): string {
return match ($food) {
"apple", "banana", "cherry" => "Fruit",
"carrot", "potato" => "Vegetable",
default => "Unknown"
};
}
echo getCategory("apple"); // 输出 "Fruit"
match()可以直接用在函数返回值,使代码更清晰。
match() 结合数组
php
$code = 404;
$messages = [
200 => "OK",
301 => "Moved Permanently",
404 => "Not Found",
500 => "Internal Server Error"
];
$message = match ($code) {
default => $messages[$code] ?? "Unknown Status"
};
echo $message; // 输出 "Not Found"
match()可以结合数组 实现动态映射
match() 结合 throw
php
$role = "guest";
$permission = match ($role) {
"admin" => "Access All",
"editor" => "Edit Content",
"user" => "View Content",
default => throw new Exception("Invalid role: $role")
};
echo $permission;
match()可以直接抛出异常,增强安全性。
match() 进阶用法
match() 结合 fn()(箭头函数)
php
$input = "php";
$result = fn() => match ($input) {
"php" => "Hypertext Preprocessor",
"js" => "JavaScript",
default => "Unknown"
};
echo $result(); // 输出 "Hypertext Preprocessor"
match()可以结合箭头函数fn(),使代码更加简洁。
match() 结合 true 模拟 switch 的 case 逻辑
php
$age = 25;
$category = match (true) {
$age < 18 => "Minor",
$age >= 18 && $age < 60 => "Adult",
default => "Senior"
};
echo $category; // 输出 "Adult"
- 这样可以避免
switch(true)的写法,让match()处理 范围匹配。
match() 的错误和注意点
必须匹配到一个值
php
$value = 5;
$result = match ($value) {
1 => "One",
2 => "Two",
3 => "Three"
};
echo $result;
错误:Uncaught UnhandledMatchError: Unhandled match case '5'
解决方法:加上 default
php
$result = match ($value) {
1 => "One",
2 => "Two",
3 => "Three",
default => "Unknown"
};