Перечисления сериализуются иначе, чем объекты. В частности, для перечислений ввели новый код сериализации —
"E"
, который обозначает название варианта перечисления.
По этому названию процедура десериализации затем находит единственный экземпляр перечисления
и присваивает значение переменной.
Это гарантирует, что:
<?php
Suit::Hearts === unserialize(serialize(Suit::Hearts));
print serialize(Suit::Hearts);
// E:11:"Suit:Hearts";
?>
PHP выдаст предупреждение и вернёт значение false
,
если не найдёт перечисление и вариант для сопоставления сериализованному значению.
При попытке сериализовать чистое перечисление в 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
)
*/
?>