Verlust von Referenzen beim Serialisieren von Objekten in PHP20 Aug

Von Julian am 20.08.2009. Es wurden 2 Kommentare hinterlassen. Du kannst einen Kommentar hinterlassen oder trackbacken.

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:&lt;br />';
echo '&lt;pre>', print_r($obj), '&lt;/pre>';
 
$original = 'Neuer Inhalt';
echo 'Nach Veränderung der Variable mit originalem Inhalt:&lt;br />';
echo '&lt;pre>', print_r($obj), '&lt;/pre>';
 
$obj = unserialize(serialize($obj));
echo 'Nach Serialisierung und Recovering des Objekts:&lt;br />';
echo '&lt;pre>', print_r($obj), '&lt;/pre>';
 
$original = 'Wieder ein weiterer Wert';
echo 'Nach zweiter Veränderung der Variable mit originalem Inhalt:&lt;br />';
echo '&lt;pre>', print_r($obj), '&lt;/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

2 Kommentare zu "Verlust von Referenzen beim Serialisieren von Objekten in PHP"

  1. Daniel sagt:

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

  2. Julian sagt:

    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.

Hinterlasse einen Kommentar

© 2009 GlobalIndustry-Project Blog