通过纯枚举实现 JsonSerializable

Implementing JsonSerializable by a Pure Enum

根据 PHP 手册

If a Pure Enum is serialized to JSON, an error will be thrown. If a Backed Enum is serialized to JSON, it will be represented by its value scalar only, in the appropriate type. The behavior of both may be overridden by implementing 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?

enum 中,每个 case 都是 enum 的对象实例。这意味着 JsonSerializable 由它们中的每一个实现。 Suit::cases() 将 return 枚举中所有情况的打包数组(a.k.a 对象),因此将对每个案例调用 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"]