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

发布于 2024-12-23 13:32:32 字数 353 浏览 2 评论 0原文

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

Is it possible to pass parameters as an associative array in ReflectionMethod::invokeArgs? This would allow me to pass the arguments in a different order than declared.

For example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

﹂绝世的画 2024-12-30 13:32:32

您可以通过覆盖 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));

要点

You can do this by overwriting the invokeArgs method and implementing the functionality you need (in your case it looks like you want to use named arguments):

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

Output:

a - 2, b - 1

Edit: An improved (supporting both named and numbered arguments as well as passing by reference) and more flexible variant (to be used for any callback) is the following class, taking any valid callback as parameter in it's constructor.

Usage:

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

Gist

っ〆星空下的拥抱 2024-12-30 13:32:32

不,手册页中没有任何内容建议您可以使用关联数组按名称重新排序参数。

No, there's nothing in the manual page that suggests you can use an associative array to re-order arguments by name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文