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

Nox*_*oxt 5 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));
Run Code Online (Sandbox Code Playgroud)

hak*_*kre 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));
Run Code Online (Sandbox Code Playgroud)

输出:

a - 2, b - 1
Run Code Online (Sandbox Code Playgroud)

编辑:改进(支持命名和编号参数以及通过引用传递)和更灵活的变体(用于任何回调)是以下类,将任何有效的回调作为参数在其构造函数中.

用法:

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

要旨