Sérialisation

Les énumérations sont sérialisées différemment des objets. En particulier, elles ont un nouveau code de sérialisation, "E", qui spécifie le nom du cas de l'énumération. La routine de désérialisation est alors en mesure d'utiliser ce code pour définir une variable à la valeur singleton existante. Cela garantit que :

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

Lors de la désérialisation, si un enum et un cas ne peuvent pas être trouvés pour correspondre à une valeur sérialisée, un avertissement sera émis et un false sera retourné.

Si une Enum pure est sérialisée en JSON, une erreur sera générée. Si une Enum avec valeur de base est sérialisée en JSON, elle sera représentée par sa valeur scalaire uniquement, dans le type approprié. Le comportement des deux peut être surchargé en implémentant la méthode JsonSerializable.

Pour print_r(), la sortie d'un cas d'enum est légèrement différente de celle des objets afin de minimiser la confusion.

<?php
enum Foo {
case
Bar;
}

enum
Baz: int {
case
Beep = 5;
}

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

/* Produit

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