phpbar.de logo

Mailinglisten-Archive

[php] Singleton

[php] Singleton

Sebastian Mendel lists at sebastianmendel.de
Fre Feb 10 12:59:23 CET 2006


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