PHP Conference Japan 2024

call_user_func

(PHP 4, PHP 5, PHP 7, PHP 8)

call_user_func调用第一个参数给出的回调函数

描述

call_user_func(callable $callback, mixed ...$args): mixed

调用由第一个参数给出的callback,并将其余参数作为参数传递。

参数

callback

要调用的callable

args

要传递给回调函数的零个或多个参数。

注意:

请注意,call_user_func()的参数不是通过引用传递的。

示例 #1 call_user_func() 示例和引用

<?php
error_reporting
(E_ALL);
function
increment(&$var)
{
$var++;
}

$a = 0;
call_user_func('increment', $a);
echo
$a."\n";

// 可以使用这个代替
call_user_func_array('increment', array(&$a));
echo
$a."\n";

// 也可以使用变量函数
$increment = 'increment';
$increment($a);
echo
$a."\n";
?>

以上示例将输出

Warning: Parameter 1 to increment() expected to be a reference, value given in …
0
1
2

返回值

返回回调函数的返回值。

示例

示例 #2 call_user_func() 示例

<?php
function barber($type)
{
echo
"您想要 $type 发型,没问题\n";
}
call_user_func('barber', "蘑菇头");
call_user_func('barber', "刮胡子");
?>

以上示例将输出

You wanted a mushroom haircut, no problem
You wanted a shave haircut, no problem

示例 #3 使用命名空间名称的 call_user_func()

<?php

namespace Foobar;

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

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

?>

以上示例将输出

Hello world!
Hello world!

示例 #4 使用 call_user_func() 的类方法

<?php

class myclass {
static function
say_hello()
{
echo
"Hello!\n";
}
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello');

$myobject = new myclass();

call_user_func(array($myobject, 'say_hello'));

?>

以上示例将输出

Hello!
Hello!
Hello!

示例 #5 使用 lambda 函数和 call_user_func()

<?php
call_user_func
(function($arg) { print "[$arg]\n"; }, 'test');
?>

以上示例将输出

[test]

备注

注意:

如果之前回调函数中抛出了未捕获的异常,则使用 call_user_func()call_user_func_array() 等函数注册的回调函数将不会被调用。

参见

添加备注

用户贡献的备注 4 条备注

gskluzacek dot nospam at gmail dot com
14 年前
如果您只想动态调用对象上的方法,则无需使用 call_user_function,而是可以执行以下操作

<?php

$method_name
= "AMethodName";

$obj = new ClassName();

$obj->{$method_name}();

?>

我已经使用过以上方法,我知道它是有效的。

此致,
-- Greg
Knightnet
17年前
无需使用此函数来调用变量类函数。你可以这样做:

$this->{$fnname}();

此示例在 PHP 5 的类内部有效。正是 {} 起到了作用。

此致,
Julian。
Nitrogen
15年前
call_user_func();的一个很好的用途是用于递归函数。
如果你正在分发代码,你经常会遇到用户重命名函数并破坏代码的情况。
在函数内部使用:call_user_func(__FUNCTION__, ... ); 来使用你想要的任何参数调用自身。

<?php
// 例如,一个极其简化的阶乘计算器…
// 当有人重命名函数时,这非常明显,它会输出错误,因为它想要调用自身。
function Factorial($i=1) {
return(
$i==1?1:$i*Factorial($i-1));
}

// 你可以给这个函数任何你想要的名字,它总是有效的,当然,如果你最初使用你给它的名字来调用它。
function qwertyuiop($i=1) {
return(
$i==1?1:$i*call_user_func(__FUNCTION__,$i-1));
}
?>

我只是没有看到任何关于递归函数的引用,而user_call_func();确实很有帮助。
James at enfsolar dot com
4年前
<?php

class MyClass{

public function
hello($str)

{

echo
'hello ' . $str;

}

}

$obj = new MyClass();

[
$obj, 'hello']('World'); // 数组可以作为函数调用
To Top