这个问题已经在这里有了答案: > PHP json_encode class private members 9个
考虑这个简化的类:
class foo {
private $fooVar;
public getFooVar(){
}
}
$fooObj = new foo();
想要我想要/需要做的就是将其转换为JSON格式,所以我想到了
echo json_encode($fooObj);
但是它不起作用,我没有fooVar和即时消息,因为$fooVar是私有的.
还有其他方法可以做到这一点而不必妥协并使$fooVar公开吗?
谢谢一群!
解决方法:
如果您使用的是PHP 5.3(或更早版本),您将无法真正轻松地完成您所要求的工作.您将不会获得以JSON编码的方法,因为JSON是一种数据格式并且不包含函数,并且您不会获得该属性,因为它是一个私有属性.您已经知道了很多,但是值得重申一下,您说得对,这并不容易.在这种情况下,即使将getter用作魔术__get()方法将其变成只读的公共属性,也无法正常工作.
在PHP 5.3中,可以使用几种解决方法.
>反思. PHP包含一个Reflection API,它使您可以访问有关对象和类的详细信息,包括从私有成员中读取值.但是,显然,这将意味着编写大量代码以获取价值,而且也不会很快.
>在类内编写json_encode调用.这样,您可以包含私有财产.我建议在对象内部使用get_object_vars($this)以JSON友好的方式获取私有属性.
如果您使用的是PHP 5.4,则还有其他选择:
> PHP 5.4引入了JsonSerializable接口.将实现JsonSerializable实现到您的类,并编写一个名为jsonSerialize()的方法.此方法应返回要包含在JSON字符串中的数据.您可以包括或排除所需的任何公共或私人财产.
PHP 5.5尚未发布,但它将为您添加另一个选项:
> PHP 5.5将引入一种更复杂的语法来定义属性,这将使您可以将属性定义为公共但只读的,或者在getter和setter中为它们包括更复杂的逻辑,但仍将它们作为属性.它将像现在__get()和__set()方法一样工作,但是将变量显式定义为属性,这意味着JSON序列化程序应该可以访问它们,而当前使用__get()则不能.
[编辑]-注意,以上段落不正确;所描述的功能未纳入PHP 5.5版本.现在还无法断定它是否会进入5.6.
希望能有所帮助.
标签:json,php
来源: https://codeday.me/bug/20191031/1974521.html