Can I pass an associative array as an argument to ReflectionMethod :: invokeArgs?

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 instance:

 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)); 
+4
source share
2 answers

You can do this by overwriting the invokeArgs method and implementing the necessary functions (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 a more flexible option (which will be used for any callback) is the next class that accepts any valid callback as a parameter in its constructor.

Using:

 $rc = new ReflectedCallback(array(new A(), 'someMethod')); echo $rc->invokeArgs(array('b' => 1, 'a' => 2)); 

Gist

+6
source

No, nothing in the manual page , which suggests that you can use an associative array to override arguments by name.

+1
source

Source: https://habr.com/ru/post/1388202/


All Articles