PHP中json_encode序列化类公有属性的行为是否可以可靠依赖?
结论
你提到的json_encode自动序列化对象所有公有属性的行为可以稳定依赖,没有兼容性风险。
这个行为是json_encode的原生默认规则,从PHP 5.2版本该函数正式加入核心以来就没有变过,目前所有正在维护的PHP版本(包括PHP 8.0+全分支)都遵循该逻辑,官方也没有任何要调整该规则的相关计划。
默认序列化的规则很清晰:只要待序列化的对象没有实现\JsonSerializable接口,json_encode就会自动提取该对象的全部公有属性作为序列化的键值对,和你示例中的输出完全一致。
如果不想实现\JsonSerializable重复声明字段,完全可以直接使用默认行为,你给出的示例写法本身就是可直接用于生产环境的标准写法。如果后续需要增加简单的序列化控制,也可以直接将对象强转为数组后传入json_encode,输出结果和默认行为完全等价:
echo json_encode((array)$dto);
如果你的项目使用PHP 8.0及以上版本,配合构造器属性提升可以进一步简化DTO的编写:
<?php class MyDTO { public function __construct( public int $foo, public bool $bar ) {} } $dto = new MyDTO(42, false); echo json_encode($dto); // 输出同样为 {"foo":42,"bar":false}
内容的提问来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

