Mailinglisten-Archive |
Hier mal mein Lösungsansatz für variable Parameter des Konstuktors. Arbeitet zwar mit eval() [eval is evil] aber ist sehr bequem wenn man weiss was man tut! :-) <?php /** * @return pointer * @desc Verwaltet die Singleton-Klasse und nimmt eine freie Anzahl an Parametern entgegen. Param1 ist die zu instanzierende Klasse, Param2 das Alias der Klasse, Param 3 bis ParamN sind optionale Parameter des Konstuktors. Liefert eine Referenz auf das instanzierte Exemplar der Klasse zurück */ function &singleton() { static $singleton; if(func_num_args() < 1) { die('FEHLER: Singleton-Funktion ohne Klassen-Name aufgerufen!'); } else { $arguments = func_get_args(); } if(!is_object($singleton)) { $singleton = new singleton(); $singleton->setIncludePath(PATH_INCLUDES); } $singleton->loadObject($arguments); return $singleton->getObject($arguments[1]); } /** * */ class singleton { /** * @var array * @desc enthält die Exemplare der geladenen Klassen */ var $objects = array(); /** * @var string * @desc Pfad zu den zu inkludenden Klassen */ var $includePath = NULL; /** * @access public * @return void * @desc Konstruktor ohne Funktion */ function singleton() { } /** * @access public * @return bool * @param arguments array * @desc lädt ein Exemplar der Klasse $arguments[0] als Alias $arguments[1] mit den Konstruktor-Parametern $arguments[2] bis $arguments[n] */ function loadObject($arguments) { $className = array_shift($arguments); $classAlias = array_shift($arguments); $argumentString = NULL; if(!class_exists($className)) { $classFile = $this->includePath.'class_'.strtolower($className).'.inc.php'; if(file_exists($classFile)) { @include_once($classFile); } } if(class_exists($className)) { if($classAlias == NULL) { die('FEHLER: Dem Singleton wurde kein Alias der Klasse "'.$className.'" übergeben!'); } if(!is_object($this->objects[$classAlias])) { for($i = 0; $i <= count($arguments) - 1; $i++) { $argumentString .= '$arguments['.$i.'], '; } $argumentString = substr($argumentString, 0, strlen($argumentString) - 2); $code = '$class = new '.$className.'('.$argumentString.');'; eval($code); $this->objects[$classAlias] = $class; $returnValue = TRUE; } else { $returnValue = FALSE; } } else { die('FEHLER: Singleton-Klasse kann kein Exemplar der Klasse "'.$className.'" erstellen!'); } return $returnValue; } /** * @access public * @return mixed * @param classAlias string * @desc liefert das Exemplar der Klasse mit dem Alias $classAlias zurück oder FALSE falls keine Klasse mit diesem Alias existiert */ function &getObject($classAlias) { if(isset($this->objects[$classAlias]) && is_object($this->objects[$classAlias])) { return $this->objects[$classAlias]; } else { return FALSE; } } function setIncludePath($path) { $this->includePath = $path; } } ?> Gruss, Andreas -- http://www.midgetcms.de
php::bar PHP Wiki - Listenarchive