# call_user_func

(PHP 4, PHP 5, PHP 7)

call_user_func — 把第一个参数作为回调函数调用

### 说明

call_user_func ( callable `$callback` [, mixed `$parameter` [, mixed `$...` ]] ) : mixed

第一个参数 `callback` 是被调用的回调函数，其余参数是回调函数的参数。

### 参数

`callback`

  将被调用的回调函数（callable）。

`parameter`

  0个或以上的参数，被传入回调函数。

  > Note:

  > 请注意，传入call_user_func()的参数不能为引用传递。

  > Example #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)); // You can use this instead before PHP 5.3
  >     echo $a."\n";
  >     ?>

  > 以上例程会输出：

  >     0
  >     1

### 返回值

返回回调函数的返回值。

### 更新日志

版本 | 说明
--- | ---
5.3.0 | 对面向对象里面的关键字的解析有所增强。在此之前，使用两个冒号来连接一个类和里面的一个方法，把它作为参数来作为回调函数的话，将会发出一个`E_STRICT`的警告，因为这个传入的参数被视为静态方法。

### 范例

Example #2 call_user_func() 的例子

    <?php
    function 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() 命名空间的使用

    <?php

    namespace Foobar;

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

    call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
    call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0

    ?>

以上例程会输出：

    Hello world!
    Hello world!

Example #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'); // As of 5.2.3

    $myobject = new myclass();

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

    ?>

以上例程会输出：

    Hello!
    Hello!
    Hello!

Example #5 把完整的函数作为回调传入call_user_func()

    <?php
    call_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() - 检测参数是否为合法的可调用结构
- callback 类型的信息
- ReflectionFunction::invoke() - Invokes function
- ReflectionMethod::invoke() - Invoke