Mailinglisten-Archive |
Maik Ryssel wrote: > Hallo zusammen, > > Ich möchte in einem Projekt genau eine Instanz einer Klasse zur Laufzeit haben. > Dazu bietet sich ja das Singletonpattern an. Leider funzt es bei mir z.Z nicht wie erwartet. > Wenn ich die Klasse instanzier werden leider keine Änderungen am Objekt die zur Laufzeit > anfallen in dem Objekt gespeichert. Die Implementierung der Singletonklasse > ist aus dem Artikel im PHP Magazin ( Entwurfsmuster in PHP - Teil 1) übernommen. > > Hier mal ein bisschen Code der das Problem verdeutlicht.... > > <code> > class Singleton > { > var $_instances = array(); > > function instance($class) { > > if (!isset($this->_instances[$class]) || !is_object($this->_instances[$class])) { > $this->_instances[$class] = new $class(); > } > > $pointer =& $this->_instances[$class]; > > return $pointer; > } > } > > function &singleton($class) { > > static $singleton; > > if (!is_object($singleton)) { > $singleton = new Singleton(); > } > > $instance = $singleton->instance($class); > > return $instance; > } > > class Foo > { > var $count = 0; > > function getCount() { > $this->count++; > return $this->count; > } > } > > $obj = singleton('Foo'); > echo "Erster Aufruf erwartet 1, Ergebniss = ".$obj->getCount()."<br>"; > $obj2 = singleton('Foo'); > echo "Zweiter Aufruf erwartet 2, Ergebniss = ".$obj2->getCount()."<br>"; > </code> > > <ausgabe> > Erster Aufruf erwartet 1, Ergebniss = 1 > Zweiter Aufruf erwartet 2, Ergebniss = 1 > </ausgabe> > > Hab ich hier ein grundsätzlichen Denkfehler oder warum wird bei beim zweiten > Aufruf von getCount() wieder 1 ausgegeben? > > Ps: System is LAMP PHP 4.3.10 mit php 5 klappt es so php 4: class Singleton { var $_instances = array(); function &instance($class) { if (!isset($this->_instances[$class]) || !is_object($this->_instances[$class])) { $this->_instances[$class] = new $class(); } $pointer =& $this->_instances[$class]; return $pointer; } } function &singleton($class) { static $singleton; if (!is_object($singleton)) { $singleton = new Singleton(); } $instance =& $singleton->instance($class); return $instance; } class Foo { var $count = 0; function getCount() { $this->count++; return $this->count; } } $obj =& singleton('Foo'); echo "Erster Aufruf erwartet 1, Ergebniss = ".$obj->getCount()."<br>"; $obj2 =& singleton('Foo'); echo "Zweiter Aufruf erwartet 2, Ergebniss = ".$obj2->getCount()."<br>"; -- Sebastian Mendel www.sebastianmendel.de www.sf.net/projects/phpdatetime | www.sf.net/projects/phptimesheet
php::bar PHP Wiki - Listenarchive