PHP

[PHP] match 표현법

어렵지만 2025. 10. 20. 14:22

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;