1

根据 PHP 手册

如果将 Pure Enum 序列化为 JSON,则会引发错误。如果支持的枚举被序列化为 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在序列化过程中控制每个案例?

4

1 回答 1

3

enum每种情况下都是 that 的对象实例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"]
于 2021-11-01T15:28:53.410 回答