Verlust von Referenzen beim Serialisieren von Objekten in PHP20 Aug
Hi,
durch mehrere Kommentare auf php.net bin ich auf die (logische) Tatsache gestoßen, dass Referenzen beim Serialisieren von Objekten verloren gehen. Darauf sollte man achten, ist aber eigentlich auch einfach zu merken.
<?php class MyVar { protected $variable; public function __construct(&$var){ $this->variable['var'] = $var; $this->variable['ref'] = &$var; } } $original = 'Originaler Inhalt'; $obj = new MyVar($original); echo 'Nach Instanzierung von MyVar mit originalem Inhalt:<br />'; echo '<pre>', print_r($obj), '</pre>'; $original = 'Neuer Inhalt'; echo 'Nach Veränderung der Variable mit originalem Inhalt:<br />'; echo '<pre>', print_r($obj), '</pre>'; $obj = unserialize(serialize($obj)); echo 'Nach Serialisierung und Recovering des Objekts:<br />'; echo '<pre>', print_r($obj), '</pre>'; $original = 'Wieder ein weiterer Wert'; echo 'Nach zweiter Veränderung der Variable mit originalem Inhalt:<br />'; echo '<pre>', print_r($obj), '</pre>'; ?>
Und meine Ausgabe:
Nach Instanzierung von MyVar mit originalem Inhalt:
MyVar Object
(
[variable:protected] => Array
(
[var] => Originaler Inhalt
[ref] => Originaler Inhalt
))
1
Nach Veränderung der Variable mit originalem Inhalt:
MyVar Object
(
[variable:protected] => Array
(
[var] => Originaler Inhalt
[ref] => Neuer Inhalt
))
1
Nach Serialisierung und Recovering des Objekts:
MyVar Object
(
[variable:protected] => Array
(
[var] => Originaler Inhalt
[ref] => Neuer Inhalt
))
1
Nach zweiter Veränderung der Variable mit originalem Inhalt:
MyVar Object
(
[variable:protected] => Array
(
[var] => Originaler Inhalt
[ref] => Neuer Inhalt
))
1
Wer Code und Ausgabe vergleicht, sieht bestimmt, dass $variable['ref'] zum Ende hin nicht ‘Wieder ein weiterer Wert’ enthält, was eine Referenz sollte. Demnach gehen Referenzen dabei verloren.
Jetzt muss mir nur noch jemand erklären, wo man serialize() und unserialize() sinnvoll einsetzen kann?
lG
Julian


Ich kenne die Funktionen noch von php4. Damals hatte ich diese verwendet um Datenobjekte in Dateien zu speichern und diese schnell wieder zur Verfügung zu haben. Jedoch würde ich es heutzutage eher vorziehen Relationale Datenbanken zu verwenden und die einzelnen Daten da abzuspeichern.
Im Grunde genommen frage ich mich auch, wo man diese Funktion heutzutage noch sinnvoll einsetzen kann
Hi,
dass während eines Durchlaufs die Referenz verloren geht, finde ich inzwischen offensichtlich und logisch. Serialize wird zwar kaum angewandt, aber ich teste momentan an einer Anwendung, die – so vorhanden – ein bestehendes Application-Objekt unserialized, um so Beständigkeit über mehrere Seitenaufrufe zu erhalten. Besteht in der Session kein solches serialisierte Objekt, wird ein neues Objekt mit zugehörigen Konfigurations- und Session-Objekten erzeugt. Der Vorteil liegt beispielsweise darin, temporär (während des Besuchs und des Lebens des Anwendungs-Objekts) Informationen über die gewünschte Sprache des Benutzers oder anderen ähnlichen Informationen zu behalten, die man beispielsweise ansonsten wieder mühsam herausfiltern müsste.