0

问题:我不想暴露$myProperty,那是不应该的public,但我需要它public只是为了__toString()

class A
{
    protected $myProperty;

    public function __toString()
    {
        return json_encode($this);
    }
}

我知道ReflectionProperty该类有一个名为 的方法setAccessible(),但是在返回字符串之前我应该​​如何使用它?

编辑:根据评论,我需要与 PHP 5.3.x 兼容,这不是JSonSerializable类。

4

2 回答 2

3

根据 PHP 5.3在方法get_object_vars内部使用__toString()

public function __toString()
{
    return json_encode(get_object_vars($this));
}

使用演示

class A
{
    protected $myProperty = 'hello';

    public function __toString()
    {
        return json_encode(get_object_vars($this));
    }
}

echo new A; 

输出:

{"myProperty":"hello"}

提示:创建自己的JsonSerializable接口并实现自己的jsonSerialize()方法以向上兼容。在需要时调用该函数和/或在内部调用它__toString()

public function __toString()
{
    return json_encode($this->jsonSerialize());
}
于 2012-12-18T00:51:52.280 回答
0

为什么不简单地构建一个 PHPstdClass对象,然后将其序列化为 JSON,因为当您从 JSON 反序列化时,这正是您所得到的。

也许是这样的:

public function __toString() {
   $return = new stdClass();
   $properties = get_object_vars($this);
   foreach ($properties as $key => $value) {
       $return->$key = $value;
   }
   return json_encode($return);
}
于 2012-12-18T00:51:05.013 回答