Monday, December 17, 2012

call_user_func_array with constructor

Hast Du jemals versucht eine Klasse mit dynamischen Konstruktor und Methoden-Parameter zu laden?

Wie zum Beispiel:
$className = 'MyClass';
$constructorParams = array('a', 'b', 'c');
$methodName = 'run';
$methodParams = array('x', 'y', 'z');
Wie würde man vorgehen? Der erste Gedanke endet wahrscheinlich so ähnlich:
$class = new $className();
$result = $class->$methodName();

Und hier fängt das Problem an. Die Parameter sind nicht übergeben und es besteht so keine Möglichkeit das zu tun.

Die Lösung für dieses Problem ist eine Kombination aus der Reflection-Klasse und dem user_call_func_array Aufruf.
$rc = new ReflectionClass($className);
if (null !== $rc->getConstructor()) {
$realClass = $rc->newInstanceArgs($constructorParams);
}
else {
$realClass = $rc->newInstance();
}
$result = call_user_func_array(array(
$realClass,
$methodName
), $methodParams);


No comments:

Post a Comment