Реализация 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"]
Другие вопросы по тегам