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