Im Bereich der objektorientierten PHP-Entwicklung kann es vorkommen, dass eine unbekannte Klasse aufgerufen werden muss. In einer Factory-Klasse beispielsweise muss man Objekte mit unbekannten Namen und unbekannter Anzahl an Parameter erzeugen.
Ein erster Schritt könnte dieser Versuch sein:
$variable_classname = 'MeineKlasse'; $instanz = new $variable_classname;
Soweit, so gut. Jedoch könnte man Schwierigkeiten haben, wenn dem Konstruktor noch Parameter überladen werden müssen. Da Klassennamen und somit auch die Klassen unterschiedlich sind, könnte jede dieser Klassen eine unbekannte Zahl an Parameter erhalten.
Dann gibt es ja auch noch die Funktion call_user_func_array. Damit könnten wir folgendes anstellen:
$parameter = array('Foo', 'Bar');
$instanz = new MeineKlasse();
call_user_func_array(array('MeineKlasse', '__construct'), $parameter);
Jedoch ist diese Funktion nur sinnvoll, wenn bereits eine Instanz des Objektes besteht. Das bedeutet aber, dass alle erwarteten Konstruktorparameter nur optional sind – und dies ist bei den wenigsten Konstruktoren der Fall. Folgende Idee funktioniert nicht:
$parameter = array('Foo', 'Bar');
call_user_func_array(array(new MeineKlasse, '__construct'), $parameter);
call_user_func_array ist also leider nicht wirklich in der Lage, direkt ein neues Objekt mit unbekannter Parameteranzahl zu erzeugen und dabei den Konstruktor aufzurufen. Was also tun?
Hier findet sich ein nützlicher Einsatz für sogenannte Reflektionsklassen (Reflection Class). Eine Reflektionsklasse könnte als fast untätiges Spiegelbild eines Klassennamens angesehen werden. Und so können wir mit Hilfe einer Reflection Class unser Vorhaben verwirklichen:
$rc = new ReflectionClass('MeineKlasse');
$class = $rc->newInstanceArgs(array('Foo', 'Bar'));
echo $class->tuIrgendwas();



Sehr gute Beschreibung, hat mir bei meinem Aktuellen Projekt echt weiter geholfen