【发布时间】:2011-07-18 09:45:12
【问题描述】:
我今天遇到了这个serialize gotcha。来自 PHP.net 文档:
注意: 对象的私有成员具有附加到成员的类名 姓名;受保护成员的成员名称前有一个“*”。这些 前置值有两边都有空字节。
我正在使用 debug_backtrace 为调试报告生成跟踪,得到json_encoded。在内部,它使用序列化程序为跟踪生成数据。
这是json_encode 的(部分)输出:
{"\u0000MyObject\u0000my_var":[]}
问题是json_decode 不能处理这个,它会抱怨空字节。
所以json_encode 愉快地写入了json_decode 无法解码的空字节。这对我来说似乎有点不可思议。我希望json_encode 负责必要的转义,或者至少json_decode 可以解析json_encode 生成的任何内容,但情况似乎并非如此。
我想我有几个解决方案:
- 从跟踪中去除空字节,我对反序列化对象不太感兴趣,我只想要一个字符串表示。
- 从跟踪中剥离私有变量。
- 修复
json_encode,使其不会产生空字节 - 修复
json_decode使其接受空字节
有人遇到过这个问题吗?您是如何解决的?
示例:
<?php
class MyClass {
public $mypublic = 1;
private $myprivate = 2;
public function myfunc() {
return debug_backtrace();
}
}
$c = new MyClass();
$json = json_encode(call_user_func_array(array($c, "myfunc"), new MyClass()));
echo $json;
echo json_decode($json); // <-- Fatal error: Cannot access property started with '\0' in test.php on line 12
解决方案
由于 PHP 5.3
call_user_func_array将在第二次发出警告call_user_func_array的参数不是数组。在此之前,您必须自己检查。
【问题讨论】: