PHP数组序列化,其中值实现Serializable

时间:2013-12-13 20:31:37

标签: php arrays class serialization interface

我遇到了一个奇怪的问题,如果我尝试序列化同一个类的对象数组,其中该类已实现Serializable接口,并且在serializable接口中返回另一个类的序列化实例,数组项在第一对夫妇被认为是递归之后。

这是一个测试用例:

<?php

class HelloWorld implements Serializable {
    public $test;

    public function __construct($str)
    {
        $this->test = $str;
    }

    public function serialize()
    {
        $simple = null;
        $simple = new Simple();
        $simple->test = $this->test;
        return serialize($simple);
    }

    public function unserialize($str)
    {
        $simple = unserialize($str);
        $this->test = $simple->test;
    }
}

class Simple
{
    public $test;
}

$list = array(
    new HelloWorld('str1'),
    new HelloWorld('str2'),
    new HelloWorld('str3'),
    new HelloWorld('str4'),
    new HelloWorld('str5'),
    new HelloWorld('str6'),
    new HelloWorld('str7'),
    new HelloWorld('str8'),
    new HelloWorld('str9'),
);

$str = serialize($list);
echo $str . "\n";

// var_dump(unserialize($str));

取消注释最后一行并享受php分段错误。

有谁知道这是为什么或如何修复它?如果HelloWorld::serialize()中序列化的内容是数组或原始值,则这似乎不是问题。

更新

以下是上述代码的输出:

a:9:{i:0;C:10:"HelloWorld":39:{O:6:"Simple":1:{s:4:"test";s:4:"str1";}}i:1;C:10:"HelloWorld":4:{r:3;}i:2;C:10:"HelloWorld":4:{r:3;}i:3;C:10:"HelloWorld":4:{r:3;}i:4;C:10:"HelloWorld":4:{r:3;}i:5;C:10:"HelloWorld":4:{r:3;}i:6;C:10:"HelloWorld":4:{r:3;}i:7;C:10:"HelloWorld":4:{r:3;}i:8;C:10:"HelloWorld":4:{r:3;}}

问题是第二个及以下记录中的r:4;内容。

1 个答案:

答案 0 :(得分:1)

该死!对不起,我读错了你的问题。以为你想打印所有这些。

您需要简单的可序列化。否则它将无法工作,为了序列化你需要使用这样的东西:

class HelloWorld implements Serializable 
{
    public $test;

    public function __construct($str)
    {
         $this->test = $str;
    }

    public function serialize()
    {
        return serialize($this->test);
    }

    public function unserialize($str)
    {
        $simple = unserialize($str);
        $this->test = $simple;
    }
}

不需要简单的课程。请记住,$ this-&gt;数据必须始终可序列化。