Php/docs/function.call-user-func
call_user_func
(PHP 4, PHP 5, PHP 7)
call_user_func — 把第一个参数作为回调函数调用
说明
第一个参数 callback
是被调用的回调函数,其余参数是回调函数的参数。
参数
callback
将被调用的回调函数(callable)。
parameter
0个或以上的参数,被传入回调函数。
Note:
请注意,传入call_user_func()的参数不能为引用传递。
Example #1 call_user_func() 的参考例子
<?phperror_reporting(E_ALL);function increment(&$var){ $var++;}$a = 0;call_user_func('increment', $a);echo $a."\n";call_user_func_array('increment', array(&$a)); // You can use this instead before PHP 5.3echo $a."\n";?>
以上例程会输出:
0 1
返回值
返回回调函数的返回值。
更新日志
版本 | 说明 |
---|---|
5.3.0 | 对面向对象里面的关键字的解析有所增强。在此之前,使用两个冒号来连接一个类和里面的一个方法,把它作为参数来作为回调函数的话,将会发出一个E_STRICT 的警告,因为这个传入的参数被视为静态方法。
|
范例
Example #2 call_user_func() 的例子
<?phpfunction barber($type){ echo "You wanted a $type haircut, no problem\n";}call_user_func('barber', "mushroom");call_user_func('barber', "shave");?>
以上例程会输出:
You wanted a mushroom haircut, no problem You wanted a shave haircut, no problem
Example #3 call_user_func() 命名空间的使用
<?phpnamespace Foobar;class Foo { static public function test() { print "Hello world!\n"; }}call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0?>
以上例程会输出:
Hello world! Hello world!
Example #4 用call_user_func()来调用一个类里面的方法
<?phpclass myclass { static function say_hello() { echo "Hello!\n"; }}$classname = "myclass";call_user_func(array($classname, 'say_hello'));call_user_func($classname .'::say_hello'); // As of 5.2.3$myobject = new myclass();call_user_func(array($myobject, 'say_hello'));?>
以上例程会输出:
Hello! Hello! Hello!
Example #5 把完整的函数作为回调传入call_user_func()
<?phpcall_user_func(function($arg) { print "[$arg]\n"; }, 'test'); /* As of PHP 5.3.0 */?>
以上例程会输出:
[test]
注释
Note:
在函数中注册有多个回调内容时(如使用 call_user_func() 与 call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。
参见
- call_user_func_array() - 调用回调函数,并把一个数组参数作为回调函数的参数
- is_callable() - 检测参数是否为合法的可调用结构
- ReflectionFunction::invoke() - Invokes function
- ReflectionMethod::invoke() - Invoke