728x90
match는 하나의 값을 여러 조건과 비교하여 일치하는 경우 특정 값을 반환하는 표현식입니다.
기존의 switch가 문이었던 것과 차이점입니다. 이로 인해 코드가 간결해지고 예측 가능해집니다.
$statusCode = 200;
// switch 문 방식
$message = '';
switch ($statusCode) {
case 200:
$message = 'OK';
break;
case 404:
$message = 'Not Found';
break;
case 500:
$message = 'Server Error';
break;
default:
$message = 'Unknown Status';
break;
}
echo "Switch: " . $message . PHP_EOL;
// match 표현식 방식 (훨씬 간결함)
$message = match ($statusCode) {
200 => 'OK',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown Status',
};
echo "Match: " . $message . PHP_EOL;

match는 쉼표로 조건을 묶을 수 있습니다.
function getStatusType(int $code): string
{
return match ($code) {
200, 201, 204 => 'Success', // 성공 그룹
400, 401, 403, 404 => 'Client Error', // 클라이언트 에러 그룹
500, 502, 503 => 'Server Error', // 서버 에러 그룹
default => 'Unknown',
};
}
echo getStatusType(201) . PHP_EOL; // Success
echo getStatusType(404) . PHP_EOL; // Client Error
echo getStatusType(302) . PHP_EOL; // Unknown

switch의 느슨한 비교(==)로 인해 발생할 수 있는 문제를 match는 도와줍니다.
$value = '1';
// switch는 '1'과 1을 같다고 판단 (느슨한 비교)
switch ($value) {
case 0:
$result = '0 입니다.';
break;
case 1:
$result = '1 입니다.'; // 이 코드가 실행됨
break;
}
echo "Switch 결과: " . $result . PHP_EOL;
// match는 '1'과 1을 다르다고 판단 (엄격한 비교)
// 일치하는 조건이 없으면 UnhandledMatchError 발생
try {
$result = match ($value) {
0 => '0 입니다.',
1 => '1 입니다.', // 타입이 다르므로 일치하지 않음
// default가 없어서 에러 발생
};
} catch (UnhandledMatchError $e) {
echo "Match 결과: 일치하는 값을 찾지 못했습니다. (에러: " . $e->getMessage() . ")" . PHP_EOL;
}

만약 default 없이 처리되지 않은 값이 들어오면 에러를 발생시켜 개발자가 실수를 인지하게 만듭니다.
$command = 'delete';
$action = match ($command) {
'create' => '생성합니다.',
'read' => '조회합니다.',
'update' => '수정합니다.',
// 'delete'에 대한 처리가 없고, default도 없음
};
// 위 코드는 'delete' 값을 처리할 수 없으므로 치명적인 에러(Fatal error: UnhandledMatchError)를 발생시키고 실행이 중단됩니다.
// 이는 개발자가 모든 가능한 케이스를 고려하도록 유도하는 안전장치입니다.
echo $action . PHP_EOL;
위 코드는 'delete' 값을 처리할 수 없으므로 에러(Fatal error: UnhandledMatchError)를 발생시키고 실행이 중단됩니다.

match의 비교 대상에 true를 넣으면, 각 조건 분기를 일반적인 조건문처럼 사용할 수 있습니다.
if-elseif-else 문을 대체할 수 있는 기능입니다.
$score = 85;
$grade = match (true) {
$score >= 90 => 'A',
$score >= 80 => 'B', // 85는 여기에 해당하므로 'B'가 반환되고 즉시 종료
$score >= 70 => 'C',
default => 'F',
};
echo "점수 {$score}점은 {$grade} 등급입니다." . PHP_EOL;

'PHP' 카테고리의 다른 글
| [PHP] Constructor Property Promotion (생성자 속성 승격) (0) | 2025.10.27 |
|---|---|
| [PHP] Fiber (파이버) 란 (0) | 2025.10.22 |
| [PHP] SplMaxHeap 가장 큰 값이 항상 맨 위에 위치하는 자료구조 (0) | 2025.10.19 |
| [PHP] SplPriorityQueue로 중요 작업 먼저 처리하기 (0) | 2025.10.16 |
| [PHP] MultipleIterator 와 foreach로 여러 배열 동시에 반복하기 (0) | 2025.10.15 |