열거형(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 매뉴얼의 열거형 관련 문서들을 함께 확인해 보세요.