2016-04-20 12 views
2

Ich merke, dass ich Array-Inhalt verliere, wenn ich ein einfaches Objekt serialisiere, und nehme an, dass ich das Array irgendwie neu schreibe. Wie lässt sich der Code richtig strukturieren, so dass Daten von ursprünglich initiierten Objekten erhalten bleiben?Verhindern, dass Objekte beim Serialisieren und Deserialisieren überschrieben werden

<?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); 
?> 

Ausgang:

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

Versuchen Implementierung 'Serializable' Schnittstelle zu' MyClass'. – Meathanjay

+0

Die Frage sieht so aus http://stackoverflow.com/questions/5161065/object-serialization-sleep –

Antwort

1

Im documentation for magic __sleep() method wir eine Erklärung finden können, wie sollte es

Diese Funktion verwendet werden, wird vor jeder Serialisierung auszuführen. Es kann das Objekt aufräumen und soll ein Array mit den Namen aller Variablen dieses Objekts, das serialisiert werden soll, zurückgeben.

Anstatt nur private Variable in __sleep zurückgeben, muss ich den Namen zurückgeben.

<?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); 

Ergebnis:

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

Versuchen Serializable Schnittstelle zu MyClass Implementierung.

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

Das ist es! Vielen Dank. – HelpNeeder

+0

@HelpNeeder Sie begrüßen :) – Meathanjay

+0

Ich habe Beispiele gelesen und ich glaube nicht, dass ich magische Funktion '__sleep' bei der Implementierung' Serializable' brauche. http://php.net/manual/en/class.serializable.php – HelpNeeder

Verwandte Themen