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