考虑这个脱衣舞课程:
class foo {
private $fooVar;
public getFooVar(){
}
}
$fooObj = new foo();
我希望/需要做的是将其转换为JSON格式,所以我想放
echo json_encode($fooObj);
然而它不起作用,我没有fooVar和我猜测因为$ fooVar是私人的..
我可以做任何其他方式而不必妥协并将$ fooVar公开?
非常感谢!
答案 0 :(得分:3)
如果您使用的是PHP 5.3(或更早版本),则无法轻松完成您的要求。你不会得到用JSON编码的方法,因为JSON是一种数据格式,不包含函数,你不会得到属性,因为它是一个私有属性。你已经知道了这一点,但值得重新指出你是对的,这并不容易。在这种情况下,即使将getter作为一种神奇的__get()
方法将其转换为只读公共属性也不行。
在PHP 5.3中,您可以使用几种解决方法。
Reflection
。 PHP包含一个Reflection API,它允许您访问有关对象和类的详细信息,包括从私有成员读取值。然而,显然,这意味着要编写一些代码以获得该值,并且它也不会很快。
在课堂内写下json_encode
来电。这样你就可以包括私人财产。我建议在对象中使用get_object_vars($this)
以JSON友好的方式获取私有属性。
如果您使用的是PHP 5.4,则还有一个选项:
JsonSerializable
接口。将implements JsonSerializable
添加到您的类,并编写一个名为jsonSerialize()
的方法。此方法应返回您要在JSON字符串中的数据。您可以包含或排除您想要的任何公共或私人财产。PHP 5.5尚未发布,但它会为您添加另一个选项:
__get()
和__set()
方法非常相似,但变量显式定义为属性,这意味着它们应该可以被JSON序列化程序访问,而目前使用{{1}他们不是。希望有所帮助。
答案 1 :(得分:1)
JSON解码对于自定义类型有点棘手,因为您没有关于JSON类型的信息。你所拥有的只是通用对象(哈希表)和数组。
但是要将对象序列化为JSON,您可以实现JsonSerializable
接口。然后json_encode
函数将执行您想要的操作。
答案 2 :(得分:0)
这将打印一个包含类foo
的所有属性(公共,私有和受保护)的JSON:
$reflection = new ReflectionClass('foo');
$properties = $reflection->getdefaultProperties();
echo json_encode($properties);