php - json_encode PHP 对象及其 protected 属性

标签 php oop

有什么方法可以设置 PHP 对象,以便在我尝试将它们转换为 JSON 时显示所有 protected 属性?

我读过其他答案,建议我向对象添加一个 toJson() 函数,但这可能对我帮助不大。在大多数情况下,我有一个对象数组,我对数组本身执行编码。

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

return json_encode($array);

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

最佳答案

您可以实现 JsonSerializable类中的接口(interface),这样您就可以完全控制它的序列化方式。您还可以创建一个 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]));

关于php - json_encode PHP 对象及其 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557446/

相关文章:

php - 使用 php 解析来自 google map api v3 的数据

javascript - JS 对象组合

c++ - 如何在 C++ 中访问命名空间中的类成员函数

javascript - 提交表单而不重新加载页面

java - 获取网站的端口号

php - 将变量从 Controller 传递到 CodeIgniter 中的 View

c++ - 关于 C++ 中的类?

python使用oop在两个模块之间共享内存

php - session 变量的 filter_input

php - 基于 Mysql 模式的复杂结果集