首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以将关联数组作为参数传递给ReflectionMethod::invokeArgs吗?

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

Stack Overflow用户
提问于 2011-12-28 05:34:32
回答 2查看 2K关注 0票数 5

ReflectionMethod::invokeArgs中可以将参数作为关联数组传递吗?这将允许我以不同于声明的顺序传递参数。

例如:

代码语言:javascript
运行
复制
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));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-28 05:41:42

您可以通过覆盖invokeArgs方法并实现所需的功能来完成此操作(在本例中,您看起来想要使用命名参数):

代码语言:javascript
运行
复制
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));

输出:

代码语言:javascript
运行
复制
a - 2, b - 1

编辑:一个改进的(支持命名参数和编号参数以及按引用传递)和更灵活的变体(用于任何回调)如下所示,它将任何有效的回调作为其构造函数中的参数。

用法:

代码语言:javascript
运行
复制
$rc = new ReflectedCallback(array(new A(), 'someMethod'));
echo $rc->invokeArgs(array('b' => 1, 'a' => 2));

Gist

票数 6
EN

Stack Overflow用户

发布于 2011-12-28 05:36:22

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8649536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档