0

我真正在寻找的是__toArray我的班级的神奇方法,但我想这样的东西不存在,而且ArrayAccess界面与我正在寻找的不匹配。

我希望能够在调用json_encode对象时返回对象的 d 表示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界面的目的。

有什么想法吗?

谢谢。

4

2 回答 2

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功能。

您真的需要对其调用序列化吗?

于 2013-08-25T19:21:25.690 回答
1

这不是Serializable界面的工作方式。

第二个示例中的输出没有关于该类的任何信息。serialize()应该只返回您需要从该对象中反序列化的数据的字符串表示形式,该对象仍以标准 PHP 序列化格式与一些类信息一起存储。

从您的方法(JSON 字符串)返回的相同数据serialize()将被传递给该unserialize()方法,因此您必须将其传递给json_decode()并自己设置其属性。

于 2013-08-25T19:35:33.520 回答