2013-08-25 74 views
0

我真正想要的是一個神奇的方法__toArray爲我的課,但我想這樣的事情不存在,並且ArrayAccess接口不符合我在找什麼對於。PHP類實現Serializable不會序列化

我希望能夠在調用serialize時返回json_encode d對象的表示形式,而不是傳統的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:{{ 「一」:1,」 b「:2}}

如果我實例的A的實例並調用它像任何舊的方法,像這樣:

$a = new A(); 
$a->serialize(); 

它按預期工作:

PHP版本: 5.4.14

序列化: { 「一」:1, 「B」:2}

儘管這種擊敗了使用Serializable界面的目的。

有什麼想法?

謝謝。

回答

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 array (
      'a' => $this->a, 
      'b' => $this->b 
     ); 
    } 

} 
echo json_encode(new A(), JSON_PRETTY_PRINT); 
$ php test.php 
{ 
    "a": 1, 
    "b": 2 
} 

但沒有 「反序列化」 ... :)

我的意思:你真的需要調用序列就可以了?

+0

我甚至不知道這樣的接口存在,但這正是我所需要的!非常感謝。 –

1

這不是如何Serializable接口工作。如果你期望第二個例子的輸出結果,那麼你就沒有關於類的任何信息。 serialize應僅返回需要反序列化此對象的數據的字符串表示形式,但仍以標準php序列化格式存儲一些類信息。

從您的serialize方法(JSON字符串)返回的相同數據將傳遞給unserialize方法,因此您必須自行設置其屬性json_decode

+0

是的,我不打算實施'unserialize',因爲我只需要通過AJAX傳遞對象數據而不需要重建狀態。 –

+0

在這種情況下,你不需要可序列化的接口,@PunKeel提到的'JsonSerializable'似乎是個好主意,或者簡單地用'getJSON()'方法創建你自己的接口,並通過調用它來對它進行編碼。 –

相關問題