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