json_encode PHP对象及其受保护的属性

时间:2015-02-17 08:16:52

标签: php oop

有没有办法设置PHP对象,以便在我尝试将它们转换为JSON时,会显示所有受保护的属性?

我已经阅读了其他答案,建议我在对象中添加toJson()函数,但这对我来说可能并不是很有帮助。在大多数情况下,我有一个对象数组,我在数组本身上执行编码。

$array = [
    $object1, $object2, $object3, 5, 'string', $object4
];

return json_encode($array);

是的,我可以遍历这个数组并在每个有这种方法的元素上调用toJson(),但这似乎并不合适。有没有办法可以使用魔法来实现这个目标?

1 个答案:

答案 0 :(得分:7)

您可以在类中实现JsonSerializable接口,这样您就可以完全控制它的序列化方式。您还可以创建Trait以防止复制粘贴序列化方法:

<?php

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

class Foo implements \JsonSerializable 
{
    protected $foo = 'bar';

    use JsonSerializer;
}

class Bar implements \JsonSerializable 
{
    protected $bar = 'baz';

    use JsonSerializer;   
}

$foo = new Foo;
$bar = new Bar;

var_dump(json_encode([$foo, $bar]));

或者,您可以使用reflection做您想做的事情:

<?php

class Foo
{
    protected $foo = 'bar';
}

class Bar
{
    protected $bar = 'baz';
}

$foo = new Foo;
$bar = new Bar;

class Seriailzer
{
    public function serialize($toJson)
    {
        $data = [];

        foreach ($toJson as $item) {
            $data[] = $this->serializeItem($item);
        }

        return json_encode($data);
    }

    private function serializeItem($item)
    {
        if (!is_object($item)) {
            return $item;
        }

        return $this->getProperties($item);
    }

    private function getProperties($obj)
    {
        $rc = new ReflectionClass($obj);

        return $rc->getProperties();
    }
}

$serializer = new Seriailzer();

var_dump($serializer->serialize([$foo, $bar]));