我可以将关联数组作为参数传递给ReflectionMethod :: invokeArgs吗?

时间:2011-12-27 21:34:32

标签: php reflection

是否可以在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));

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

Gist

答案 1 :(得分:1)

不,the manual page中没有任何内容表明您可以使用关联数组按名称重新排序参数。