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

如何获取含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:43:27