Реализация JsonSerializable с помощью чистого перечисления
Согласно руководству по PHP
Если Pure Enum сериализуется в JSON, будет выдана ошибка. Если Backed Enum сериализован в JSON, он будет представлен только его скалярным значением в соответствующем типе. Поведение обоих может быть изменено путем реализации JsonSerializable.
Попробуем реализовать
JsonSerializable
enum Suit implements JsonSerializable
{
case Hearts;
case Diamonds;
case Clubs;
case Spades;
public function jsonSerialize(): array {
return [1, 2, 3, 4];
}
}
echo json_encode(Suit::cases());
Он печатает:
[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
Почему
[1,2,3,4]
дублируется 4 раза?
Как контролировать каждый случай в
enum
во время сериализации?
1 ответ
В каждом случае является экземпляром объекта этого
enum
. Это означает
JsonSerializable
реализуется каждым из них.
Suit::cases()
вернет упакованный массив всех случаев в перечислении (также известный как объекты), поэтому
jsonSerialize
метод будет вызываться для каждого из них, следовательно, дублированные массивы.
Как контролировать каждый случай в перечислении во время сериализации?
Мы можем просто использовать
match
выражение
public function jsonSerialize(): string {
return match($this) {
Suit::Hearts => 'H',
Suit::Diamonds => 'D',
Suit::Clubs => 'C',
Suit::Spades => 'S'
};
}
Он печатает:
["H","D","C","S"]