Могу ли я передать ассоциативный массив в качестве аргумента в ReflectionMethod :: invokeArgs?

Можно ли передавать параметры как ассоциативный массив в ReflectionMethod::invokeArgs ? Это позволило бы мне передать аргументы в другом порядке, чем объявлено.

Например:

 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)); 

Вы можете сделать это, перезаписав метод invokeArgs и внедряя необходимые функции (в вашем случае похоже, что вы хотите использовать именованные аргументы):

 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)); с 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)); 

Вывод:

 a - 2, b - 1 

Редактирование: улучшенный (поддерживающий как именованные, так и нумерованные аргументы, а также передача по ссылке) и более гибкий вариант (который будет использоваться для любого обратного вызова) – это следующий класс, принимающий любой действительный обратный вызов как параметр в его конструкторе.

Применение:

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

Суть

Нет, на странице руководства нет ничего, что подсказывает, что вы можете использовать ассоциативный массив для переопределения аргументов по имени.