0

私が本当に探していたのは、__toArray私のクラスの魔法のメソッドでしたが、そのようなものは存在しないと思いますし、ArrayAccessインターフェースは私が探しているものと一致しません。

が呼び出されたときに、従来の PHP 文字列表現ではなくjson_encode、オブジェクトの d 表現を返せるようにしたいと考えています。serialize

これは私のコードの例ですが、うまくいきません。

<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>

メソッドの 1 つを省略するとエラーが表示されるため、インターフェイスを正しく実装していることはわかっています。ただし、これは私のスクリプトが返すものです:

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

1

それはSerializableインターフェースの仕組みではありません。

2 番目の例の出力には、クラスに関する情報がありません。serialize()そのオブジェクトからシリアル化を解除する必要があるデータの文字列表現のみを返す必要があります。これは、標準の PHP シリアル化形式でいくつかのクラス情報と共に保存されています。

メソッドから返された同じデータserialize()(JSON 文字列) がメソッドに渡されるため、unserialize()メソッドに渡してjson_decode()そのプロパティを自分で設定する必要があります。

于 2013-08-25T19:35:33.520 に答える