通过纯枚举实现 JsonSerialized

Fat*_*ror 2 php enums php-8.1

根据PHP手册

如果将 Pure Enum 序列化为 JSON,则会抛出错误。如果将支持的枚举序列化为 JSON,则它将仅由其值标量以适当的类型表示。两者的行为都可以通过实现 JsonSerialized 来覆盖

让我们尝试实现一下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());
Run Code Online (Sandbox Code Playgroud)

它打印:

[[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
Run Code Online (Sandbox Code Playgroud)

为什么[1,2,3,4]重复4次?

如何控制enum序列化过程中的每个案例?

Fat*_*ror 5

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'
    };
}
Run Code Online (Sandbox Code Playgroud)

它打印:

["H","D","C","S"]
Run Code Online (Sandbox Code Playgroud)