PHP 8.4.2 Released!

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

call_user_func_array调用回调函数,并把一个数组参数作为回调函数的参数

说明

call_user_func_array(callable $callback, array $args): mixed

把第一个参数作为回调函数(callback)调用,把参数数组作(args)为回调函数的的参数传入。

参数

callback

被调用的回调函数。

args

要被传入回调函数的数组。

如果 args 的 key 都是数字,则会忽略 key,并按顺序将每个元素作为位置参数传递给 callback

如果 args 的任一 key 是字符串,则这些元素将作为命名参数传递给 callback,名称由 key 指定。

args 中,如果数字 key 在 字符串 key 之后出现,或者字符串 key 与 callback 的任何参数名称不匹配,将会导致 fatal error。

返回值

返回回调函数的结果。如果出错的话就返回 false

更新日志

版本 说明
8.0.0 args 键现在将被解释为参数名称,而不是被默默地忽略。

示例

示例 #1 call_user_func_array()例子

<?php
function foobar($arg, $arg2) {
echo
__FUNCTION__, " got $arg and $arg2\n";
}
class
foo {
function
bar($arg, $arg2) {
echo
__METHOD__, " got $arg and $arg2\n";
}
}


// Call the foobar() function with 2 arguments
call_user_func_array("foobar", array("one", "two"));

// Call the $foo->bar() method with 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>

以上示例的输出类似于:

foobar got one and two
foo::bar got three and four

示例 #2 call_user_func_array()使用命名空间的情况

<?php

namespace Foobar;

class
Foo {
static public function
test($name) {
print
"Hello {$name}!\n";
}
}

call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));

call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

?>

以上示例的输出类似于:

Hello Hannes!
Hello Philip!

示例 #3 把完整的函数作为回调传入call_user_func_array()

<?php

$func
= function($arg1, $arg2) {
return
$arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4)));

?>

以上示例会输出:

int(8)

示例 #4 传引用

<?php

function mega(&$a){
$a = 55;
echo
"function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo
"global \$bar=$bar\n";

?>

以上示例会输出:

function mega $a=55
global $bar=55

示例 #5 call_user_func_array() 使用命名参数

<?php
function foobar($first, $second) {
echo
__FUNCTION__, " got $first and $second\n";
}

// Call the foobar() function with named arguments in non-positional order
call_user_func_array("foobar", array("second" => "two", "first" => "one"));

// Call the foobar() function with one named argument
call_user_func_array("foobar", array("foo", "second" => "bar"));

// Fatal error: Cannot use positional argument after named argument
call_user_func_array("foobar", array("first" => "one", "bar"));

?>

以上示例的输出类似于:

foobar got one and two
foobar got foo and bar

Fatal error: Uncaught Error: Cannot use positional argument after named argument

注释

注意:

在函数中注册有多个回调内容时(如使用 call_user_func()call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。

参见

添加备注

用户贡献的备注 1 note

up
40
sebastian dot rapetti at tim dot it
3 years ago
Using PHP 8, call_user_func_array call callback function using named arguments if an array with keys is passed to $args parameter, if the array used has only values, arguments are passed positionally.

<?php

function test(string $param1, string $param2): void
{
echo
$param1.' '.$param2;
}

$args = ['hello', 'world'];
//hello world
call_user_func_array('test', $args);

$args = ['param2' => 'world', 'param1' => 'hello'];
//hello world
call_user_func_array('test', $args);

$args = ['unknown_param' => 'hello', 'param2' => 'world'];
//Fatal error: Uncaught Error: Unknown named parameter $unknown_param
call_user_func_array('test', $args);
?>
To Top