PHP Pure Enum实现JsonSerializable时序列化重复问题咨询
为什么[1,2,3,4]重复出现4次
Suit::cases()会返回当前枚举所有实例的数组,你的Suit枚举一共定义了4个case(Hearts、Diamonds、Clubs、Spades),所以返回的数组长度为4,每个元素都是对应的枚举实例。- 你实现的
jsonSerialize方法是硬编码返回固定数组[1,2,3,4],不管哪个枚举实例调用这个方法,返回的结果完全相同。json_encode遍历cases()返回的4个实例时,每个实例都会触发一次jsonSerialize调用,自然就得到了4个重复的[1,2,3,4]。
如何单独控制每个case的序列化结果
分两种场景实现即可:
场景1:使用回退枚举(Backed Enum)
如果你的枚举可以绑定标量值,直接在jsonSerialize中返回当前实例的绑定值即可,示例如下:
enum Suit: int implements JsonSerializable { case Hearts = 1; case Diamonds = 2; case Clubs = 3; case Spades = 4; public function jsonSerialize(): int { return $this->value; } } echo json_encode(Suit::cases()); // 输出:[1,2,3,4]
场景2:使用纯枚举(Pure Enum)
如果不需要绑定标量值,可以通过match表达式匹配当前实例,返回自定义的序列化内容:
enum Suit implements JsonSerializable { case Hearts; case Diamonds; case Clubs; case Spades; public function jsonSerialize(): string { return match($this) { self::Hearts => '红桃', self::Diamonds => '方块', self::Clubs => '梅花', self::Spades => '黑桃', }; } } echo json_encode(Suit::cases()); // 输出:["红桃","方块","梅花","黑桃"]
内容的提问来源于stack exchange,提问作者Rain
相关产品推荐
相关产品推荐

