在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));发布于 2011-12-28 05:41:42
您可以通过覆盖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));发布于 2011-12-28 05:36:22
不,the manual page中没有任何内容表明您可以使用关联数组按名称对参数进行重新排序。
https://stackoverflow.com/questions/8649536
复制相似问题