是否可以在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));
答案 0 :(得分:6)
您可以通过覆盖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));
输出:
a - 2, b - 1
编辑:改进的(支持命名和编号的参数以及通过引用传递)和更灵活的变体(用于任何回调)是以下类,将任何有效的回调作为参数在它的构造函数中。
用法:
$rc = new ReflectedCallback(array(new A(), 'someMethod'));
echo $rc->invokeArgs(array('b' => 1, 'a' => 2));
答案 1 :(得分:1)
不,the manual page中没有任何内容表明您可以使用关联数组按名称重新排序参数。