Сериализация

Перечисления сериализуются иначе, чем объекты. В частности, для перечислений ввели новый код сериализации — "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";

PHP выдаст предупреждение и вернёт значение false, если не найдёт перечисление и вариант для сопоставления сериализованному значению.

Опция allowed_classes функции unserialize() не влияет на перечисления.

При попытке сериализовать чистое перечисление в JSON-формат выбрасывается исключение (если только функцию вызвали с флагом JSON_THROW_ON_ERROR — прим. перев.). При сериализации типизированного перечисления в JSON-формат оно представляется только своим скалярным значением того типа, который указали в перечислении. Поведение сериализации как чистых, так и типизированных перечислений переопределяется путём реализации интерфейса JsonSerializable.

Для функции print_r() вывод варианта перечисления незначительно отличается от объектов, чтобы уменьшить путаницу.

<?php

enum Foo
{
    case Bar;
}

enum Baz: int
{
    case Beep = 5;
}

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

/* Выводит

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