如何将PHP关联数组用作函数调用参数?

3
假设有一个带有一些参数的函数,我有一个关联数组(或者一个简单的带有公共属性的对象——几乎是一样的,因为我可以始终使用类型转换(object)$array),其键对应于函数参数名称,值对应于函数调用参数。我该如何调用它并将它们传递进去?
<?php
function f($b, $a) { echo "$a$b"; }
// notice that the order of args may differ.
$args = ['a' => 1, 'b' => 2];
call_user_func_array('f', $args); // expected output: 12 ; actual output: 21
f($args); // expected output: 12 ; actual output: ↓
// Fatal error: Uncaught ArgumentCountError:
// Too few arguments to function f(), 1 passed

你应该展示一个代码示例,说明你想要做的事情。 - undefined
@JohnConde 我很愿意帮忙,但问题是我不知道如何在php中做到这一点。我已经添加了一个示例,但它并没有起作用。 - undefined
2个回答

4
事实证明,我只需要使用PHP 8中引入的可变函数参数解包的命名参数功能即可(https://wiki.php.net/rfc/named_params#variadic_functions_and_argument_unpacking)。
f(...$args); // output: 12

在 PHP 8 之前,这段代码会产生错误:Cannot unpack array with string keys

其次,事实证明,在 PHP 8 中call_user_func_array也按预期工作(请参见https://wiki.php.net/rfc/named_params#call_user_func_and_friends以获取说明):

call_user_func_array('f', $args); // output: 12

- 在旧版本中,它仍会输出错误的 '21'。

1
作为旧版本PHP的一个hack,您也可以使用Reflection:
<?php
function test($b, $a) {
  echo "$a$b";
}

$callback = 'test';

$parameters = ['a' => 1, 'b' => 2];

$reflection = new ReflectionFunction($callback);
$new_parameters = array();

foreach ($reflection->getParameters() as $parameter) {
  $new_parameters[] = $parameters[$parameter->name];
}

$parameters = $new_parameters;

call_user_func_array($callback, $parameters);

演示


是的,我也考虑过这个问题,但看起来似乎有点过于复杂了,对于一个看似简单的事情来说。但对于较旧的PHP版本来说,这可能是唯一可行的解决方案。但我认为这太过繁琐了,也许这是一个信号,表明我们不应该使用将参数作为关联数组传递,而是使用反射机制,我个人的意见。 - undefined
1
这就是为什么我写下了“作为一个hack”。我也不喜欢这个解决方案。但是到现在为止,使用关联数组来调用call_user_func确实很奇怪。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接