본문 바로가기
PHP

[PHP] match 표현식

by teamnova 2025. 10. 20.
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;