枚举的序列化方式与对象不同。具体来说,它们具有一个新的序列化代码 "E"
,它指定了枚举 case 的名称。然后反序列化例程可以使用它将变量设置为现有单例值。这确保了
<?php
Suit::Hearts === unserialize(serialize(Suit::Hearts));
print serialize(Suit::Hearts);
// E:11:"Suit:Hearts";
?>
在反序列化时,如果无法找到与序列化值匹配的枚举和 case,则会发出警告并返回 false
。
如果将纯枚举序列化为 JSON,将抛出错误。如果将支持枚举序列化为 JSON,它将仅由其标量值表示,以适当的类型。两种行为都可能通过实现 JsonSerializable 来覆盖。
对于 print_r(),枚举 case 的输出与对象略有不同,以最大限度地减少混淆。
<?php
enum Foo {
case Bar;
}
enum Baz: int {
case Beep = 5;
}
print_r(Foo::Bar);
print_r(Baz::Beep);
/* Produces
Foo Enum (
[name] => Bar
)
Baz Enum:int {
[name] => Beep
[value] => 5
}
*/
?>