singleton Klasse & (un)serialize

lolilol

Mitglied
Hallo,

ich arbeite derzeit mit einer singleton Klasses (PHP 5), die zwischenzeitlich in einer Session Variable gespeichert wird:
PHP:
$myClass = singletonClass::getInstance();
$_SESSION['myClass'] = serialize($myClass);
Später wird diese Klasse wieder mit unserialize() hergestellt:
PHP:
$myClass = unserialize($_SESSION['myClass']);
Bis hierhin läuft auch alles gut, die Klasse ist in ihrer vorherigen Instanz wieder da und ihre Inhalte auch, aber wenn ich jetzt noch einmal die Methode getInstance() anwende, bekomme ich eine neue, zweite Instanz der Klasse zurück! Was dem Singleton Prinzip natürlich nicht entspricht und mich vor einige Probleme stellt.
PHP:
$myClass = unserialize($_SESSION['myClass']);
$myClassSecond = singletonClass::getInstance();
// $myClass !== $myClassSecond

Hat jemand eine Idee, warum das so ist? Oder einen Workaround?

Gruß und Danke,
loli
 
Durch die Deserialisierung wird eine neue Objektinstanz erstellt. Erst durch den erneuten Aufruf der getInstance()-Methode ist die Einzelinstanz wieder zu bekommen.
PHP:
var_dump($single = Singleton::getInstance());
var_dump($single = unserialize(serialize($single)));
var_dump($single = $single->getInstance());
 
Mhh... ich bin jetzt auf eine Lösung gekommen. Ich dachte dass serialize erkennt, das die $instance Variable auf ein sich selbst zeigt (Referenzen auf ein Objekt selber werden von serialize() laut Dokumentation übernommen).

Als Lösung, falls auch einmal jemand anderes dieses Problem hat, muss die Klasse wie folgt aussehen:
PHP:
class singletonClass {

  static private $instance;

  static public function getInstance() {
		if (!self::$instance) {
                        $c = __CLASS__;
			self::$instance = new $c();
		}
		return (self::$instance);
  }

  public function __wakeup () {
                self::$instance = $this;
  }

}

Die Funktion __wakeup () wird von unserialize() aufgerufen. Durch das speichern von sich selber in $instance wird das von unserialize() erzeugt Objekt als Einzelinstanz gehandhabt.

Gruß,
loli
 
Zurück