PHP在运行时公开受保护的属性

时间:2012-12-18 00:42:18

标签: php reflection public protected

问题:我不想公开$myProperty,即不应该public,但我需要public只为__toString()

class A
{
    protected $myProperty;

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

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

编辑:根据评论,我需要与PHP 5.3.x兼容,即没有JSonSerializable类。

2 个答案:

答案 0 :(得分:3)

根据PHP 5.3,在__toString()方法中使用get_object_vars

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

用法Demo

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());
}

答案 1 :(得分:0)

为什么不简单地构建一个PHP stdClass对象,然后将其序列化为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);
}