考虑这个 stripdown 类:
class foo {
private $fooVar;
public getFooVar(){
}
}
$fooObj = new foo();
我想要/需要做的是将其转换为 JSON 格式,所以我想到了放置
echo json_encode($fooObj);
但是它不起作用,我没有 fooVar,我猜是因为 $fooVar 是私有(private)的..
我可以通过其他方式做到这一点而不必妥协并公开 $fooVar 吗?
非常感谢!
如果您使用的是 PHP 5.3(或更早版本),您将无法真正轻松地完成您的要求。您不会获得以 JSON 编码的方法,因为 JSON 是一种数据格式并且不包含函数,并且您不会获得该属性,因为它是私有(private)属性。你已经知道这么多了,但值得重申的是,你是对的,这并不容易。在这种情况下,即使将 getter 编写为神奇的 __get()
方法以将其变成只读公共(public)属性也行不通。
在 PHP 5.3 中,您可以使用一些解决方法。
如果您使用的是 PHP 5.4,您还有一个额外的选择:
- PHP 5.4 引入了一个
JsonSerializable
接口(interface)。将 implements JsonSerializable
添加到您的类中,并编写一个名为 jsonSerialize()
的方法。此方法应返回您希望在 JSON 字符串中的数据。您可以包括或排除您想要的任何公共(public)或私有(private)属性(property)。
PHP 5.5 尚未发布,但它会为您添加另一个选项:
PHP 5.5 将引入更复杂的属性定义语法,这将允许您将属性定义为公共(public)但只读的,或者在 getter 和 setter 中为它们包含更复杂的逻辑,但仍然拥有它们作为属性。它的工作方式与 __get()
和 __set()
方法现在的工作方式非常相似,但变量明确定义为属性,这意味着它们应该可供JSON 序列化器,而目前使用 __get()
它们不是。
[EDIT] - 注意,上面的段落是不正确的;所描述的特性并没有出现在 PHP 5.5 版本中。现在说它是否会进入 5.6 还为时过早。
希望对您有所帮助。