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

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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open