近期项目过程中,有一处场景需要使用 json_encode 方法序列化某对象内的 protected 属性。

0x00 实现

谈到 json_encode 自然想到 <code>JsonSerializable</code> 接口,此接口提供一个抽象方法:

abstract public mixed JsonSerializable::jsonSerialize ( void )

于是我们可以这样实现:

class Foo implements \JsonSerializable
{
    public $fooProperty;

    protected $barProperty;

    public function jsonSerialize()
    {
        return [
            'fooProperty' => $this->fooProperty,
            'barProperty' => $this->barProperty,
        ];
    }
}

0x01 优雅

然而我并不满足如上的实现,感觉太不优雅——修改、增加属性都需要改两处,代码强迫症表示非常受不了。

后来经过 Google,发现 PHP 有个「神奇」的函数:get_object_vars,如上代码稍加修改即可:

class Foo implements \JsonSerializable
{
    public $fooProperty;

    protected $barProperty;

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

完美!

0x02 小结

喜欢 PHP 的其中一个原因:由于原生的弱类型、Associate 数组等特性,支撑起不少这种看起来很「神奇」的函数的存在,对于本身比较喜欢遵循规范开发的 Coders 来说,相比 .NET 的「繁复优雅」,在业务层面有这些 Helpers 的加持,简直可以说如鱼得水,能够缩短不少开发周期。