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

PHP8带类型提示对象通过json_encode序列化时空属性缺失的解决方法

解决PHP json_encode不序列化未赋值对象属性的问题

问题根源

你遇到的核心问题在于get_object_vars()的行为——这个函数只会返回对象中已经被赋值过的属性,哪怕你在类定义里声明了这些属性但没给初始值,它们也不会被包含进来。这就是为什么SomeObject实例序列化后变成了空数组[]。

解决方案

下面提供几种不同的实现方式,你可以根据需求选择:


方法1:给类属性直接设置默认值

最简单的方式是在SomeObject的属性声明阶段就指定默认值,这样即使没有显式赋值,属性也会存在于对象实例中,get_object_vars()就能捕获到它们:

class SomeObject implements JsonSerializable {
    public string $placeholder = "";
    public string $id = "";
    public string $model = "";
    public string $value = "";
    // 注意:你预期输出空字符串,但原属性是bool类型,这里如果要匹配预期可以改成string类型
    public string $disabled = "";
    public string $required = "";

    public function jsonSerialize() {
        return get_object_vars($this);
    }
}

方法2:在构造函数中初始化所有属性

如果不想在属性声明时绑定默认值,可以在SomeObject的构造函数里统一给所有属性赋值:

class SomeObject implements JsonSerializable {
    public string $placeholder;
    public string $id;
    public string $model;
    public string $value;
    public string $disabled;
    public string $required;

    public function __construct() {
        $this->placeholder = "";
        $this->id = "";
        $this->model = "";
        $this->value = "";
        $this->disabled = "";
        $this->required = "";
    }

    public function jsonSerialize() {
        return get_object_vars($this);
    }
}

方法3:手动构建序列化数组(最灵活)

如果需要精准控制每个属性的输出(比如类型转换、特殊兜底逻辑),可以在jsonSerialize()方法里手动列出所有属性并设置值:

class SomeObject implements JsonSerializable {
    public string $placeholder;
    public string $id;
    public string $model;
    public string $value;
    public bool $disabled;
    public bool $required;

    public function jsonSerialize() {
        return [
            'placeholder' => $this->placeholder ?? "",
            'id' => $this->id ?? "",
            'model' => $this->model ?? "",
            'value' => $this->value ?? "",
            // 这里可以把布尔值强制转为空字符串,匹配你的预期
            'disabled' => is_bool($this->disabled) ? "" : $this->disabled ?? "",
            'required' => is_bool($this->required) ? "" : $this->required ?? "",
        ];
    }
}

测试结果

使用以上任意一种方法修改后,执行你的代码就能得到符合预期的JSON输出:

{
    "mainName": "MainObject",
    "someObject": {
        "placeholder": "",
        "id": "",
        "model": "",
        "value": "",
        "disabled": "",
        "required": ""
    }
}

内容的提问来源于stack exchange,提问作者Mani Muridi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:02:46