列舉的序列化方式與物件不同。具體來說,它們有一個新的序列化代碼 "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
}
*/
?>