열거형(Enum) 직렬화

열거형(Enum) 직렬화

이 페이지는 PHP의 열거형(enum)이 객체와는 다르게 직렬화(serialization)되는 방식을 다뤄요. 열거형 케이스가 어떤 인코딩 코드를 통해 저장되고, 역직렬화될 때 어떤 일이 벌어지는지 설명해 드릴게요.

출처: Serialization

본문

열거형은 객체와 다르게 직렬화돼요. 특히 열거형에는 새 직렬화 코드인 "E" 가 있는데, 이 코드가 열거형 케이스의 이름을 지정해 줘요. 그러면 역직렬화 루틴이 그 이름을 이용해 기존의 싱글턴 값을 변수에 할당할 수 있어요. 이 덕분에 다음이 보장돼요:

<?php

enum Suit: string
{
    case Hearts = 'H';
    case Diamonds = 'D';
    case Clubs = 'C';
    case Spades = 'S';
}

Suit::Hearts === unserialize(serialize(Suit::Hearts));

print serialize(Suit::Hearts);
// E:11:"Suit:Hearts";

역직렬화할 때, 직렬화된 값과 일치하는 열거형과 케이스를 찾을 수 없다면 경고가 발생하고 false 가 반환돼요.

unserialize() 의 allowed_classes 옵션은 열거형에는 영향을 주지 않아요.

순수 열거형(Pure Enum)이 JSON으로 직렬화되면 오류가 발생해요. 백트 열거형(Backed Enum)이 JSON으로 직렬화되면 적절한 타입의 스칼라 값으로만 표현돼요. 두 가지 모두 JsonSerializable 을 구현해서 동작을 재정의할 수 있어요.

print_r() 의 경우, 열거형 케이스의 출력은 혼동을 줄이기 위해 객체와는 약간 다르게 표시돼요.

<?php

enum Foo
{
    case Bar;
}

enum Baz: int
{
    case Beep = 5;
}

print_r(Foo::Bar);
print_r(Baz::Beep);

/* Produces

Foo Enum (
    [name] => Bar
)
Baz Enum:int {
    [name] => Beep
    [value] => 5
}
*/

더 알아보기

열거형(Enum)의 전반적인 개념이나 다른 직렬화 동작에 대해 더 알아보고 싶다면 PHP 매뉴얼의 열거형 관련 문서들을 함께 확인해 보세요.