## 列挙型をシリアライズする

列挙型は、オブジェクトとは違う形でシリアライズされます。 特別に、列挙型には case 名を指定する新しいシリアライズコード "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";

アンシリアライズする際に、 マッチする列挙型と case がシリアライズした値に見つからなかった場合は、 警告が発生し、`false` が返されます。

unserialize() の `allowed_classes` オプションは、 列挙型(Enum) には影響しません。

Pure Enum を JSON にシリアライズしようとすると、 Error がスローされます。 Backed Enum を JSON にシリアライズしようとすると、 適切な型の、スカラーの値だけが表現されます。 これらの振る舞いは、 JsonSerializable を実装することでオーバーライドできます。

print_r() 向けに、 列挙型の case の出力はオブジェクトと少し違う形式になっています。 これは、混乱を最小限に抑えるためです。

    <?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