JsonSerializable接口
浏览:1213次 出处信息
昨天funlake提醒了我, 应该把一些PHP的新动向传播一下.
恭喜候鸟加入了pdt,有什么新进展别忘了给咱cn phper通报一下呀。
那么, 今天为大家介绍一下5.4中对Json做的一个改进.
Json是Ajax应用中最为通用的数据传输格式(协议), 主流的编程语言都带有对Json的支持, 在PHP中, 有json_encode/json_decode, 可以很方便的构造Json数据格式.
- <?php
- echo json_encode(array(1,2,3,4));
- ?>
- //[1,2,3,4]
也可以Json化一个对象:
- <?php
- $o = new stdclass;
- $o->a = 42;
- echo json_encode($o);
- ?>
- //{"a":42}
但这样就有个问题, 现实生活中的对象是很复杂的, Json的这种默认只对属性做操作的做法有的时候是不能解决问题的, 比如我们希望通过私有成员来做一些计算得到最后的Json化数据, 又或者我们希望用一个字符串来代替一个object.
在以前, 那你只能自己拼凑Json串了. 不过感谢Sara, 在5.4中, Json新增了一个JsonSerializable接口, 任何实现了这个接口的类, 需要定义一个jsonSerialize()方法, 这个方法会在对这个类的对象做Json化的时候被调用, 这个时候你就可以在这个方法内 , 随意调整最终的Json化的结果:
- <?php
- class JsonTest implements JsonSerializable {
- private $a, $b;
- public function __construct($a, $b) {
- $this->a = $a;
- $this->b = $b;
- }
- public function jsonSerialize() {
- return $this->a + $this->b;
- }
- }
- echo json_encode(new JsonTest(23, 42));
- ?>
- //65
下面是个稍微复杂点的例子:
- <?php
- $data = array(
- new stdClass();
- new JsonTest(1,2),
- new JsonTest(3,4),
- array(5,6)
- );
- echo json_encode($data);
- ?>
- //[{},3,7,[5,6]]
最后提醒一下, PHP 5.4还处于开发阶段, 在最终release之前, 这些特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.
谢谢
PS: 这个特性最初由Johannes在他自己的blog中介绍: http://schlueters.de/blog/archives/135-Jason,-let-me-help-you!.html
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:回答下在bugs.php上的一个问题
后一篇:Array dereferencing >>
文章信息
- 作者:雪候鸟 来源: 风雪之隅
- 标签: JsonSerializable
- 发布时间:2011-10-11 23:55:16
近3天十大热文
- [66] Go Reflect 性能
- [66] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [47] 读书笔记-壹百度:百度十年千倍的29条法则