我真正想要的是为我的班级提供一个神奇的方法__toArray
,但我想这样的东西不存在,ArrayAccess
界面与我正在寻找的不匹配对
我希望能够在调用json_encode
时返回对象的serialize
表示,而不是传统的PHP字符串表示。
以下是我的代码示例,我无法开始工作。
<pre>
<?php
class A implements Serializable {
private $a,
$b,
$c;
public function __construct () {
$this->a = 1;
$this->b = 2;
$this->c = 3;
}
public function serialize () {
return json_encode(array (
'a' => $this->a,
'b' => $this->b
));
}
public function unserialize ($serialized) {
}
}
echo '<b>PHP version:</b> ',
phpversion(),
PHP_EOL,
'<b>Serialized:</b> ',
serialize(new A());
?>
</pre>
我知道我正在正确实现接口,因为如果我省略其中一个方法,则会显示错误。但是,这是我的脚本返回的内容:
PHP版本: 5.4.14
序列化: C:1:“A”:13:{{“a”:1,“b”:2}}
如果我实例化A
的实例并像任何旧方法一样调用它,就像这样:
$a = new A();
$a->serialize();
按预期工作:
PHP版本: 5.4.14
序列化: {“a”:1,“b”:2}
虽然这种方法违背了使用Serializable
界面的目的。
有什么想法吗?
感谢。
答案 0 :(得分:3)
http://php.net/manual/fr/jsonserializable.jsonserialize.php怎么办?
像这样:
$ cat test.php
<?php
class A implements JsonSerializable {
private $a,
$b,
$c;
public function __construct () {
$this->a = 1;
$this->b = 2;
$this->c = 3;
}
public function jsonSerialize() {
return [
'a' => $this->a,
'b' => $this->b
];
}
}
echo json_encode(new A(), JSON_PRETTY_PRINT);
$ php test.php
{
"a": 1,
"b": 2
}
但是没有unserialize
功能。
你真的需要调用序列化吗?
答案 1 :(得分:1)
这不是Serializable
接口的工作原理。如果您期望第二个示例的输出,则您没有关于类的任何信息。 serialize
应该只返回你需要反序列化这个对象的数据的字符串表示,但是它仍然以标准的php序列化格式存储了一些类信息。
从serialize
方法(JSON字符串)返回的相同数据将传递给unserialize
方法,因此您必须json_decode
并自行设置其属性。