Is it possible to pass parameters as an associative array in ReflectionMethod::invokeArgs
? This would allow me to pass the arguments in a different order than declared.
For example:
class A
{
public function someMethod($a, $b)
{
return sprintf("a - %s, b - %s", $a, $b);
}
}
$rm = new ReflectionMethod('A', 'someMethod');
echo $rm->invokeArgs(new A(), array('b' => 1, 'a' => 2));
You can do this by overwriting the invokeArgs
method and implementing the functionality you need (in your case it looks like you want to use named arguments):
class ReflectionMethodA extends ReflectionMethod
{
public function invokeArgs($object, Array $args = array())
{
$parameters = $this->getParameters();
foreach($parameters as &$param)
{
$name = $param->getName();
$param = isset($args[$name]) ? $args[$name] : $param->getDefaultValue();
}
unset($param);
return parent::invokeArgs($object, $parameters);
}
}
$rm = new ReflectionMethodA('A', 'someMethod');
echo $rm->invokeArgs(new A(), array('b' => 1, 'a' => 2));
Output:
a - 2, b - 1
Edit: An improved (supporting both named and numbered arguments as well as passing by reference) and more flexible variant (to be used for any callback) is the following class, taking any valid callback as parameter in it's constructor.
Usage:
$rc = new ReflectedCallback(array(new A(), 'someMethod'));
echo $rc->invokeArgs(array('b' => 1, 'a' => 2));
Gist
No, there's nothing in the manual page that suggests you can use an associative array to re-order arguments by name.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With