【问题标题】:Implementing JsonSerializable by a Pure Enum通过纯枚举实现 JsonSerializable
【发布时间】:2021-12-16 07:30:28
【问题描述】:

根据 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中的每个case?

【问题讨论】:

    标签: php enums php-8.1


    【解决方案1】:

    enum 中,每个案例都是enum 的对象实例。这意味着JsonSerializable 由他们每个人实现。 Suit::cases() 将在枚举(也称为对象)中返回所有案例的打包数组,因此将在每个案例上调用 jsonSerialize 方法,因此重复的数组。

    序列化过程中如何控制枚举中的每个case?

    我们可以简单地使用match 表达式

    public function jsonSerialize(): string {
        return match($this) {
            Suit::Hearts => 'H',
            Suit::Diamonds => 'D',
            Suit::Clubs => 'C',
            Suit::Spades => 'S'
        };
    }
    

    打印出来:

    ["H","D","C","S"]
    

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多