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
相关产品推荐
相关产品推荐

