Christoph Herrmann schrieb:
> Habe mit Reflektion noch nie gearbeitet. Instanziert werden die Objekte
> derzeit über "$object = $classname();". Wobei die Prüfung mit Reflection
> ähnlich aussehen würde. Da bekomme ich auch ein Array mit den
> Basisklassen bzw. Interfaces.
Falls es jemand benötigt:
/**
* Gibt ein Objekt der uebergebenen Klasse zurueck
*
* Die Methode ist fuer den sicheren Umgang mit der Instanzierung einer
* Klasse zustaendig, von welcher nur der Klassenname bekannt ist. Dabei
* kann der Name einer Basisklasse oder Interface uebergeben werden, auf
* welche die zu instanzierende Klasse ueberprueft wird sowie Parameter.
* Ist die Klasse nicht abgeleitet, implementiert nicht das Interface oder
* ist nicht instanzierbar wird eine "SystemcoreException" geworfen
*
* [at] author Christoph Herrmann
* [at] version 18.12.2007
* [at] since 18.12.2007
*
* [at] param string $classname Der Name, der zu instanzierenden Klasse
* [at] param string $instanceof Der Name des Interface oder der Basisklasse
* [at] param mixed $argument Einzelner Parameter fuer den Konstruktor
* [at] return Object Das instanzierte Objekt der gewuenschten Klasse
*/
public function getObject($classname, $instanceof = null, $argument = null)
{
$reflection = new ReflectionClass($classname);
/*
* Es wird ueberprueft, ob die Klasse das Interface implementiert oder
* von der Basisklasse erbt, wenn der Parameter uebergeben wurde
*/
if(isset($instanceof))
{
if(in_array($instanceof, $reflection->getInterfaces()) == false
&&
$reflection->isSubclassOf($instanceof) == false)
{
/*
* Die gewuenschte Klasse implementiert nicht das geforderte
* Interface und ist nicht von der Basisklasse abgeleitet
*/
throw new SystemcoreException(0, array('classname' => $classname,
'instanceof' =>
$instanceof));
}
}
/*
* Es wird ueberprueft, ob die Klasse instanziert werden kann, sprich
* nicht abstrakt ist oder einen geschuetzten Konstruktor besitzt
*/
if($reflection->isInstantiable() == false)
{
/*
* Die Klasse, welche instanziert werden soll, ist abstrakt oder
* besitzt einen geschuetzten Konstruktor
*/
throw new SystemcoreException(0, array('classname' => $classname,
'instanceof' => $instanceof));
}
return $reflection->newInstance($argument);
}
Wer die Methode verwenden will kann dies gerne tun, es muss nur das
Werfen der Exceptions angepasst werden. Habs grob getestet und sollte
von daher auch so funktionieren.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
