You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:45:02