实现Serializable的PHP类不会序列化

时间:2013-08-25 19:11:07

标签: php serialization interface serializable php-5.4

我真正想要的是为我的班级提供一个神奇的方法__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界面的目的。

有什么想法吗?

感谢。

2 个答案:

答案 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并自行设置其属性。