2016-04-20 7 views
2

シンプルなオブジェクトをシリアライズするときに配列の内容が失われていることに気づいています。何とか配列を書き換えていると仮定します。どのようにしてコードを構造化して、最初に開始したオブジェクトからのデータ保存を可能にするか?シリアライズとシリアライズ解除時にオブジェクトの書き換えを防止する

<?php 

class MyClass { 

    private $array; 

    function __construct($array) { 
     $this->array = $array; 
    } 

    public function __sleep() { 
     return $this->array; 
    } 
} 

$array = array(
    'i1' => 1, 
    'i2' => 2, 
    'i3' => 3, 
    'i4' => 4 
); 

$obj = new MyClass($array); 
$ser = serialize($obj); 
$des = unserialize($ser); 

print_r($obj); 
echo '<br><br>'; 
print_r($ser); 
echo '<br><br>'; 
print_r($des); 
?> 

出力:

MyClass Object ([array:MyClass:private] => Array ([i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4)) 

O:7:"MyClass":4:{s:1:"1";N;s:1:"2";R:2;s:1:"3";R:2;s:1:"4";R:2;} 

MyClass Object ([array:MyClass:private] => [1] => [2] => [3] => [4] =>) 
+1

MyClass' 'へ' Serializable'インタフェースを実装してみます。 – Meathanjay

+0

質問はこのように見えます。http://stackoverflow.com/questions/5161065/object-serialization-sleep –

答えて

1

我々は、関数が前の任意のシリアル化に実行されていることが

を使用する方法を説明を見つけることができます。それはオブジェクト をきれいにすることができ、は、のすべての の変数をシリアル化する必要があるという名前の配列を返します。

プライベート変数を__sleepに戻す代わりに、その名前を返す必要があります。

<?php 

class MyClass { 

    private $array; 
    private $test; 

    function __construct($array, $test) { 
     $this->array = $array; 
     $this->test = $test; 
    } 

    public function __sleep() {   
     return array('array', 'test'); 
    } 
} 

$test = 'test'; 
$array = array(
    'i1' => 1, 
    'i2' => 2, 
    'i3' => 3, 
    'i4' => 4 
); 

$obj = new MyClass($array, $test); 
$ser = serialize($obj); 
$des = unserialize($ser); 

print_r($obj); 
echo '<br><br>'; 
print_r($ser); 
echo '<br><br>'; 
print_r($des); 

結果:

MyClass Object ([array:MyClass:private] => Array ([i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4) [test:MyClass:private] => test) 

O:7:"MyClass":2:{s:14:"MyClassarray";a:4:{s:2:"i1";i:1;s:2:"i2";i:2;s:2:"i3";i:3;s:2:"i4";i:4;}s:13:"MyClasstest";s:4:"test";} 

MyClass Object ([array:MyClass:private] => Array ([i1] => 1 [i2] => 2 [i3] => 3 [i4] => 4) [test:MyClass:private] => test) 
1

MyClassSerializableインタフェースを実装してみます。 documentation for magic __sleep() method

class MyClass implements Serializable { 

    private $array; 

    function __construct($array) { 
     $this->array = $array; 
    } 

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

    public function unserialize($array) { 
     $this->data = unserialize($array); 
    } 

    public function __sleep() { 
     return $this->array; 
    } 
} 
+0

これはそれです!ありがとうございました。 – HelpNeeder

+0

@HelpNeederあなたが歓迎します:) – Meathanjay

+0

私は例を読んできました。私は '__sleep'という魔法の関数が必要ではないと思います。 http://php.net/manual/en/class.serializable.php – HelpNeeder

関連する問題