Menu

PHP match 표현식: match와 switch 차이, match(true)

match ($x) { 1, 2 => 'low', default => 'other' }는 값을 엄격한 ===로 비교하고, 처음 일치한 갈래의 결과를 반환하며, 아무것도 일치하지 않으면 UnhandledMatchError를 던집니다. match와 switch의 차이, match(true), enum과 함께 쓰는 match를 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

match ($value) { ... }는 값을 여러 갈래와 엄격한 ===로 비교하고, 처음 일치한 갈래의 결과를 반환합니다. 여러 값이 한 갈래를 공유할 수 있고, default가 나머지를 받으며, 아무것도 일치하지 않으면 PHP가 UnhandledMatchError를 던집니다.

닫는 중괄호 뒤의 세미콜론을 보세요. match는 1 + 2처럼 표현식이므로 전체가 하나의 대입문입니다. 각 갈래는 values => result 형태이고 쉼표로 구분하며, 마지막 갈래 뒤의 쉼표도 허용됩니다.

갈래 하나에 여러 값

값을 쉼표로 나열하세요. 대상이 그중 하나와 동일(===)하면 그 갈래가 일치합니다.

여기서처럼 함수에서 match를 바로 반환하는 것이 가장 흔한 사용법입니다.

match와 switch

같은 매핑을 두 방식으로 쓰고, 가장 큰 차이인 비교 방식을 보여 주는 입력 하나를 넣었습니다. switch는 ==를 쓰므로 문자열 "1"이 case 1과 일치합니다. match는 ===를 쓰므로 일치하지 않습니다.

matchswitch
비교엄격한 ===느슨한 ==
결과값을 반환문장, 반환값 없음
폴스루없음있음, break까지
여러 값1, 2 =>겹쳐 쓴 case 1: case 2:
일치 없음UnhandledMatchError를 던짐아무것도 하지 않음
분기 본문표현식 하나문장 여러 개 가능

값 하나를 다른 값으로 바꿀 때는 match를 쓰세요. 분기에 여러 문장이 필요하거나 폴스루 자체가 목적이라면 switch를 쓰세요. 두 경우 모두 switch 페이지에 있습니다.

UnhandledMatchError: 일치하는 갈래가 없을 때

default 갈래가 없으면 아무것과도 일치하지 않는 값은 조용한 null이 아니라 에러입니다. 이것은 장점입니다. 새 상태 코드나 오타가 슬그머니 지나가지 않고 크게 실패합니다.

PHP는 PHP Fatal error: Uncaught UnhandledMatchError: Unhandled match case of type string와 함께 멈춥니다. 개발 환경(zend.exception_ignore_args가 꺼진 상태)에서는 값을 직접 보여 줍니다: Unhandled match case 'XL'. default => 'other'를 추가하거나, 알 수 없는 값이 예상되는 곳에서 에러를 잡아 해결하세요.

범위와 조건을 위한 match(true)

match는 대상을 각 갈래와 비교하므로, 대상이 true라면 모든 갈래가 조건이 될 수 있습니다. 처음으로 정확히 true로 평가되는 조건이 선택됩니다.

이 블록에는 두 가지 포인트가 있습니다. PHP 8부터 throw는 표현식이므로 갈래의 결과가 될 수 있습니다. 그리고 비교가 엄격하므로 각 조건은 진짜 불리언을 반환해야 합니다. $name => ... 같은 갈래는 $name이 비어 있지 않은 문자열이어도 true와 절대 일치하지 않습니다. 일치한 갈래만 평가되므로 throw는 나이가 음수일 때만 실행됩니다.

enum과 함께 쓰는 match

match와 enum은 잘 어울립니다. enum 메서드 안에서 match ($this)로 각 case를 값에 매핑합니다. enum 자체는 PHP enum을 참고하세요.

여기에는 일부러 default를 두지 않았습니다. 나중에 누군가 다섯 번째 case를 추가하면 거기서 color()를 호출할 때 잘못된 색을 반환하지 않고 에러를 던집니다.

갈래 하나에 여러 문장

갈래는 표현식 하나를 담으므로 'save' => { ...; ... }는 올바른 PHP가 아닙니다. 작업을 함수로 옮기고 갈래에서 호출하세요. 일치하지 않는 갈래의 함수는 호출되지 않습니다.

$format을 'json'이나 'xml'로 바꾸고 다시 실행해 보세요.

자주 묻는 질문

PHP에서 match와 switch의 차이는 무엇인가요?

match는 엄격한 ===로 비교하고, 값을 반환하며, 다음 갈래로 넘어가지 않고, 갈래 하나에 쉼표로 구분한 여러 값을 받으며, 일치하는 갈래가 없으면 UnhandledMatchError를 던집니다. switch는 느슨한 ==로 비교하고, 아무것도 반환하지 않는 문장이며, break가 없으면 아래로 이어지고, 일치하는 case가 없으면 조용히 아무것도 하지 않습니다.

PHP match 표현식에서 일치하는 갈래가 없으면 어떻게 되나요?

PHP가 UnhandledMatchError를 던집니다. 나머지 모든 값을 처리하려면 default => ... 갈래를 추가하거나, try { ... } catch (\UnhandledMatchError $e) { ... }로 에러를 잡으세요.

PHP에서 '보다 크다' 같은 조건과 함께 match를 쓰려면 어떻게 하나요?

true와 매칭하세요: match (true) { $age < 13 => 'child', $age < 18 => 'teen', default => 'adult' }. 각 갈래가 조건이 되고, 처음으로 정확히 true인 것이 선택됩니다.

PHP match 갈래에서 여러 문장을 실행할 수 있나요?

아니요, 각 갈래는 표현식 하나입니다. 문장들을 함수나 메서드에 넣고 갈래에서 호출하세요. 예: 'export' => exportCsv($rows).

match는 어느 PHP 버전에서 추가되었나요?

PHP 8.0입니다. PHP 7에서는 같은 로직에 switch 문이나 $labels[$status] ?? 'Unknown' 같은 배열 조회가 필요합니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기