PHP 大会日本 2024

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

使用第一个参数中给定的 callbackargs 中的参数调用回调函数。

参数

callback

要调用的 callable

args

要传递给回调函数的参数,以数组形式给出。

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

如果 args 的任何键都是字符串,则这些元素将作为命名参数传递给 callback,名称由键给出。

如果 args 中的数字键出现在字符串键之后,或者字符串键与 callback 的任何参数名称不匹配,则会导致致命错误。

返回值

返回回调函数的返回值,或在出错时返回 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";
}
}


// 使用 2 个参数调用 foobar() 函数
call_user_func_array("foobar", array("one", "two"));

// 使用 2 个参数调用 $foo->bar() 方法
$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 使用 Lambda 函数

<?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";
}

// 使用非位置顺序的命名参数调用 foobar() 函数
call_user_func_array("foobar", array("second" => "two", "first" => "one"));

// 使用一个命名参数调用 foobar() 函数
call_user_func_array("foobar", array("foo", "second" => "bar"));

// 致命错误:在命名参数之后不能使用位置参数
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 条注释

40
sebastian dot rapetti at tim dot it
3 年前

使用 PHP 8 中的 call_user_func_array 调用回调函数,如果传递给 $args 参数的是一个包含键的数组,则使用命名参数调用;如果使用的数组仅包含值,则按位置传递参数。

<?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