열거형(Enum) 예제
열거형(Enum) 예제
이 페이지는 PHP 열거형(enum)을 실제 코드에서 어떻게 활용하는지 보여 주는 예제들을 모아 놓았어요. 제한된 값 집합을 표현하고, 인자 타입을 안전하게 강제하는 방법을 배워 볼게요.
출처: Examples
본문
Example #1 기본적인 제한된 값
<?php
enum SortOrder
{
case Asc;
case Desc;
}
function query($fields, $filter, SortOrder $order = SortOrder::Asc)
{
/* ... */
}
이제 query() 함수는 $order 가 반드시 SortOrder::Asc 또는 SortOrder::Desc 중 하나라는 것을 보장받고 안전하게 진행할 수 있어요. 다른 값은 TypeError 를 발생시키므로 추가적인 오류 검사나 테스트가 필요 없어요.
Example #2 고급 배타적 값
<?php
enum UserStatus: string
{
case Pending = 'P';
case Active = 'A';
case Suspended = 'S';
case CanceledByUser = 'C';
public function label(): string
{
return match ($this) {
self::Pending => 'Pending',
self::Active => 'Active',
self::Suspended => 'Suspended',
self::CanceledByUser => 'Canceled by user',
};
}
}
$status = UserStatus::Suspended;
var_dump($status->label());
이 예제에서 사용자 상태는 정확히 UserStatus::Pending, UserStatus::Active, UserStatus::Suspended, UserStatus::CanceledByUser 중 하나만 될 수 있어요. 함수는 매개변수를 UserStatus 타입으로 지정할 수 있고, 그러면 그 네 값만 받아 들여요. 그 외에는 절대 안 되죠.
네 값 모두 사람이 읽을 수 있는 문자열을 반환하는 label() 메서드를 가지고 있어요. 이 문자열은 예를 들어 데이터베이스 필드나 HTML select 박스에 사용될 수 있는 "머신 네임" 스칼라 동등 문자열과는 독립적이에요.
<?php
enum UserStatus: string
{
case Pending = 'P';
case Active = 'A';
case Suspended = 'S';
case CanceledByUser = 'C';
public function label(): string
{
return match($this) {
self::Pending => 'Pending',
self::Active => 'Active',
self::Suspended => 'Suspended',
self::CanceledByUser => 'Canceled by user',
};
}
}
foreach (UserStatus::cases() as $case) {
printf(
"<option value=\"%s\">%s</option>\n",
htmlentities($case->value),
htmlentities($case->label())
);
}
더 알아보기
열거형의 기본 개념, 케이스 정의, 그리고 열거형을 활용한 다양한 패턴에 대해 더 알고 싶다면 PHP 매뉴얼의 열거형 관련 문서들을 함께 확인해 보세요.