0%

call_user_func_array-call_user_func

《谁伴我闯荡》是中国香港摇滚乐队Beyond演唱的一首粤语歌曲,由刘卓辉作词,黄家驹作曲,Beyond编曲,收录在Beyond于1991年9月6日发行的粤语专辑《犹豫》中。该歌曲也是Beyond自传式电影《莫欺少年穷》的插曲之一,也是Beyond为数不多的专为电影创作作品。另外,本歌曲在港剧《笑看风云》中也被用做插曲。

一、call_user_func

  1. 语法 `call_user_func(callable $callback[, mixed $parameter[, mixed $… ]]):mixed

  2. 说明:把第一个参数作为回调函数调用

    • 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数
  3. demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function increment(&$var){
    $var++;
    }
    $a = 0;
    $b = &$a;
    call_user_func('increment', $b);
    echo $a;
    输出:0

    call_user_func_array('increment', array(&$a));
    echo $a;
    输出:1

    传入call_user_func()的参数不能为引用传递。

二、call_user_func_array

  1. 语法 call_user_func_array(callable $callback, array $param_arr):mixed

  2. 说明:调用回调函数,并把一个数组参数作为回调函数的参数

    • 参数:第一个参数作为回调函数调用,把参数数组作为回调函数的的参数传入
      • 参数数组得是索引数组
    • 返回值:正常返回回调函数的结果,出错的话就返回FALSE
  3. demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    1.直接调用函数
    function func($arg, $arg2, $arg3 = 3) {
    echo __FUNCTION__, " 拿到参数 $arg 和 $arg2 和 $arg3 \n";
    }
    call_user_func_array("func", [1, 2]);
    输出:func 拿到参数 1 和 2 和 3

    2.调用对象的方法
    class Test {
    function method($arg, $arg2) {
    echo __METHOD__, " 拿到参数 $arg 和 $arg2\n";
    }
    }
    //调用类的方法
    $test = new Test();
    call_user_func_array(array($test, "method"), [3, 4]);
    输出:Test::method 拿到参数 3 和 4

三、对比

  1. call_user_func可以传一个参数,也可传多个,跟回调函数的参数有关,call_user_func_array只有2个参数,必须传2个参数
  2. call_user_func传的参数是字符串形式,call_user_func_array传的参数是数组形式
  3. call_user_func不能引用传递传参数,call_user_func_array允许引用传递
  4. 性能上call_user_func比call_user_func_array快