Chciałbym stworzyć metodę, do której przekazujemy x parametrów, gdzie zawsze pierwszy parametr jest to nazwa klasy, jaką należy użyć do tworzenia obiektu, a pozostałe parametry są przekazywane do konstruktora. Wiem że jest możliwe zastosowanie tutaj klasy ReflectionClass, ale niestety do wzorca singletonu, gdzie konstruktor jest inny niż publiczny nie nadaje się po prostu.
Jak można czytać wyżej, chcę stworzyć klasę dla wzorca Singletonu z możliwością przekazania parametrów w momencie tworzenia obiektu, poniżej to co udało mi się namaszkiecić:
Kod
abstract class Singleton {
final public function __clone() {
trigger_error("Clone is not allowed for " . get_class($this), E_USER_ERROR);
}
public static function getInstance($sClass) {
static $aInstances = array();
if(!isset($aInstances[$sClass])) {
$aParams = array();
$aTemp =& func_get_args();
array_shift($aTemp);
foreach($aTemp as $key => $value) {
$aParams[$key] = '$aTemp[' . $key . ']';
}
eval('$aInstances[$sClass] = new ' . $sClass . '(' . implode(', ', $aParams) . ');');
}
return $aInstances[$sClass];
}
}
final public function __clone() {
trigger_error("Clone is not allowed for " . get_class($this), E_USER_ERROR);
}
public static function getInstance($sClass) {
static $aInstances = array();
if(!isset($aInstances[$sClass])) {
$aParams = array();
$aTemp =& func_get_args();
array_shift($aTemp);
foreach($aTemp as $key => $value) {
$aParams[$key] = '$aTemp[' . $key . ']';
}
eval('$aInstances[$sClass] = new ' . $sClass . '(' . implode(', ', $aParams) . ');');
}
return $aInstances[$sClass];
}
}
Jak do tej pory nie udało mi się tego bardziej zoptymalizować pod kątem wydajności, jednak zauważyłem, że przy użyciu ReflectionClass wydajność jest większa o ok. 70% ale problem właśnie taki, że konstruktor musi byc publiczny.
Jakies sugestie?