如何使用 PHP 关联数组作为函数调用参数?
How to use a PHP associative array as function call arguments?
假设有一个带有一些参数的函数并且我有一个关联数组(或一个具有 public 属性的简单对象 - 这几乎是一样的,因为我总是可以使用类型转换 (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
事实证明,我只需要使用 PHP 8 ( https://wiki.php.net/rfc/named_params#variadic_functions_and_argument_unpacking ) 中引入的名为 param 的可变参数解包功能即可:
f(...$args); // output: 12
在 PHP 8 之前,此代码产生错误:Cannot unpack array with string keys
.
其次,事实证明 call_user_func_array
在 PHP 8 中也能按预期工作(解释见 https://wiki.php.net/rfc/named_params#call_user_func_and_friends):
call_user_func_array('f', $args); // output: 12
- 虽然它在旧版本中仍然输出不正确的“21”。
作为旧版本 PHP 的 hack,您还可以使用反射:
<?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);
假设有一个带有一些参数的函数并且我有一个关联数组(或一个具有 public 属性的简单对象 - 这几乎是一样的,因为我总是可以使用类型转换 (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
事实证明,我只需要使用 PHP 8 ( https://wiki.php.net/rfc/named_params#variadic_functions_and_argument_unpacking ) 中引入的名为 param 的可变参数解包功能即可:
f(...$args); // output: 12
在 PHP 8 之前,此代码产生错误:Cannot unpack array with string keys
.
其次,事实证明 call_user_func_array
在 PHP 8 中也能按预期工作(解释见 https://wiki.php.net/rfc/named_params#call_user_func_and_friends):
call_user_func_array('f', $args); // output: 12
- 虽然它在旧版本中仍然输出不正确的“21”。
作为旧版本 PHP 的 hack,您还可以使用反射:
<?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);