Gestern bin ich auf das Problem gestoßen, dass ich Objekte nicht dynamisch instantiieren kann, so ähnlich wie es bei Funktionen und Methoden mit „call_user_func_array“ funktioniert.

Also hab ich eine eigene Funktion geschrieben, die den Klassennamen und ein Array aller Parameter übergeben bekommt. Daraus wird dann der Codeschnipsel erzeugt, der das Objekt erstellt. Dieser Codeschnipsel wird dann mit eval ausgeführt und das neue Objekt zurückgegeben.
Das ganze sieht dann so aus:

function createInstance($className, array $arguments = null) {
	if ($arguments == null) {
		$arguments = array();
	}
	
	// generate instantiate code
	$instantiateCode = '$object = new '.$className.'(';
	if (sizeof($arguments) > 0) {
		foreach($arguments AS $key => $arg) {
			$instantiateCode .= '$arguments["'.$key.'"], ';
		}
		$instantiateCode = preg_replace('/, $/', ');', $instantiateCode);
	} else {
		$instantiateCode .= ');';
	}
	
	// instantiate and return object
	eval($instantiateCode);
	return $object;
}

Falls jemand eine coolere Idee hat, dann her damit. :)

Der Anwendungszweck ist übrigens folgender:
Ich hab eine Library mit der ich gewisse Basisfunktionalitäten anbiete. Wenn jemand nun etwas verändern möchte, ohne die Updatefähigkeit zu verlieren, erstellt er eine neue Klasse mit der neuen Logik und lässt diese von der entsprechende Standardklasse erben. Damit die neue Logik jetzt auch an allen anderen Stellen im Code verwendet wird, müsste man überall den neuen Klassennamen eintragen, das will aber keiner.
Also hab ich die genannte „createInstance()“ Methode gebaut, die vor dem instantiieren überprüft ob eine Klasse mit dem Präfix „Custom_“ existiert. Wenn dem so ist, wird das Objekt der Kindklasse erzeugt. (Das Präfix muss vorher definiert sein.)

Advertisements