call_user_func

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

call_user_func调用第一个参数指定的回调

描述

call_user_func(可调用 $callback, 混合 ...$args): 混合

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

参数

callback

要调用的 可调用

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 使用 call_user_func() 的 lambda 函数

<?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
13 年前
如果你只是想动态地调用一个对象上的方法,那么没有必要使用 call_user_function,而是可以做以下操作

<?php

$method_name
= "AMethodName";

$obj = new ClassName();

$obj->{$method_name}();

?>

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

致敬,
-- Greg
Knightnet
16 年前
你不需要使用这个函数来调用一个变量类函数。相反,你可以做以下操作

$this->{$fnname}();

这个例子在 PHP 5 中从类内部工作。是 {} 起了作用。

致敬,
Julian.
Nitrogen
14 年前
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