如何获取含getter和setter的PHP类的JSON表示及相关疑问
关于Getter/Setter与JSON序列化的问题解答
嘿,我来帮你拆解这两个问题~
一、如何获取单个/全部属性的JSON格式
你之前调用json_encode($this)得到空JSON,核心原因是:你的类属性是private私有修饰符,而json_encode()默认只能序列化对象的公共(public)属性,私有属性它无权访问,所以输出了空对象{}。
获取单个属性的JSON
很简单,先通过魔术方法__get拿到属性值,再把它包装成键值对数组后编码即可:
$obj = new MyClass(); $obj->firstField = 321; // 生成单个属性的JSON $singleFieldJson = json_encode(['firstField' => $obj->firstField]); echo $singleFieldJson; // 输出:{"firstField":321}
获取全部属性的JSON
有两种实用方案:
- 方案1:自定义数组转换方法
给MyClass新增一个方法,手动把私有属性收集到数组中,再对数组进行JSON编码:
class MyClass { // 原有属性和__get、__set方法保留 public function toArray() { return [ 'firstField' => $this->firstField, 'secondField' => $this->secondField ]; } } // 使用示例 $obj = new MyClass(); $obj->firstField = 321; $obj->secondField = 123; $fullJson = json_encode($obj->toArray()); echo $fullJson; // 输出:{"firstField":321,"secondField":123}
- 方案2:实现
JsonSerializable接口
通过实现PHP内置的JsonSerializable接口,自定义json_encode()的序列化逻辑,这样直接编码对象就能得到正确结果:
class MyClass implements JsonSerializable { private $firstField; private $secondField; // 原有__get、__set方法保留 public function jsonSerialize() { return [ 'firstField' => $this->firstField, 'secondField' => $this->secondField ]; } } // 使用示例 $obj = new MyClass(); $obj->firstField = 321; $obj->secondField = 123; echo json_encode($obj); // 输出:{"firstField":321,"secondField":123}
二、Setter中return $this的作用
这绝对不是笔误!它是PHP中实现链式调用的经典技巧。
当你在__set(或自定义的setter方法)中返回$this(当前对象实例),就可以在一行代码中连续调用多个赋值/方法操作,让代码更简洁。比如:
// 如果是自定义显式setter的场景,链式调用会更直观: class MyClass { // ...原有代码 public function setFirstField($value) { $this->firstField = $value; return $this; } public function setSecondField($value) { $this->secondField = $value; return $this; } } // 链式调用示例 $obj = new MyClass(); $obj->setFirstField(321)->setSecondField(123);
这种写法避免了重复写$obj->,让代码更紧凑易读。
内容的提问来源于stack exchange,提问作者user1032531
相关产品推荐
相关产品推荐

