PHP Performance bei dynamischen Methodenaufrufen

Lukas [php, Tricks und Tools]

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.

Variante 1: Reflections

$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.

Variante 2: call_user_method_array

$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.

Variante 3: call_user_func_array

$class = new DynamicMethodInvoke();
call_user_func_array(array($class, "method"), array("param1", "param2"));

Ausführungszeit: 0.00830 Sekunden

Variante 4: Geschweifte Klammern

$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.

zurück