问题:我不想公开$myProperty
,即不应该public
,但我需要public
只为__toString()
:
class A
{
protected $myProperty;
public function __toString()
{
return json_encode($this);
}
}
我知道ReflectionProperty
类有一个名为setAccessible()
的方法,但是在返回字符串之前我应该如何使用它?
编辑:根据评论,我需要与PHP 5.3.x兼容,即没有JSonSerializable
类。
答案 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);
}