Die Klasse kenne ich, aber je nachdem was der Benutzer gerade macht kommt eine andere Methode zum Zuge. Es gibt es verschiedene Möglichkeiten mit solchen Anforderungen umzugehen. Möglicherweise kann man ein switch-Konstrukt aufbauen. Manchmal muss man schlichtweg den Methodennamen in einer Variable haben und die Methode dynamisch aufrufen. Dafür gibt es verschiedene Möglichkeiten. Wir testen wieder mit unserer Zeit-Ausführungs-Test-Umgebung mit 1000 Wiederholungen.
$class = new DynamicMethodInvoke();
$refMethod = new ReflectionMethod($class, "method");
$refMethod->invokeArgs($class, array("param1", "param2"));
Ausführungszeit: 0.01104 Sekunden
Objektorientiert schön und sauber mit Reflections.
$class = new DynamicMethodInvoke();
call_user_method_array("method", $class, array("param1", "param2"));
Ausführungszeit: 0.02465
call_user_method_array ist seit PHP 4.1 deprecated. Wenn man die Variante 3 ansieht, weiss man auch warum.
$class = new DynamicMethodInvoke();
call_user_func_array(array($class, "method"), array("param1", "param2"));
Ausführungszeit: 0.00830 Sekunden
$class = new DynamicMethodInvoke();
$class->{"method"}("param1", "param2");
Ausführungszeit: 0.00500 Sekunden
Die deprecated Variante lassen wir aussen vor. Von Reflections zu geschweiften Klammern kann man immer noch rund die Hälfte der Zeit einsparen. Der grosse Unterschied: Bei Reflections erhält man bei einer nichtexistenten Methode eine Exception, während bei letzter Variante ein Fatal-Error geworfen wird. Was ist nun der bessere Weg: Es kommt auf die Anforderungen an.