使用call_user_func_array()来回调执行函数与直接使用函数的区别是什么?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

使用call_user_func_array()来回调执行函数与直接使用函数的区别是什么?

2016-06-17 17:34:18 1888 1

对比了半天还是没发现有什么太大的区别,可能是我没有找到体现出使用call_user_func_array()这个函数的优势的场景。
谁知道的告知下。
给个介绍的文章链接也行~

function foo($a,$b){
    return 2*(intval($a)+intval($b));
}
function bar($a,$b){
    return 3*foo($a,$b);
}
echo bar(3,2);

function foo($a,$b){
    return 2*(intval($a)+intval($b));
}
function bar(){
    return 3*call_user_func_array('foo', func_get_args());
}
echo bar(3,2);

参考一楼大拿给的,的确不错:

function playVideo($video)
{
    echo '哥在用用Video看电影-',$video;
}

function playAudio($artist,$music)
{
    echo '哥在用Mp3听',$artist,'的歌-',$music;
}

function play()
{
    $args = func_get_args();

    $functionName = array_shift($args);

    call_user_func_array( 'play'.$functionName, $args );
}

play('Video','《功夫》');

echo '<br>';

play('Audio', 'Jay','《简单爱》');
取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:43:16

    很多场景是这样的:
    1、你要调用的函数名是未知的
    2、要调用函数的参数类型及个数也是未知的
    因为未知,所以得用call_user_func_array这样的函数。

    一个应用场景:
    定时任务类需要定时运行一个函数,则接口就可以类似这样设计:

    /**
     * 在$run_time时刻运行$call_back
     */
    function task_add($run_time, $call_back, $param_arr){
        while(1){
            if(time()>=$run_time){
                call_user_func_array($call_back, $param_arr);
                return;
            }
            sleep(1);
        }
    }

    $call_back和$param_arr是用户传递的,可以是任意函数任意参数。这种场景下很难直接调用函数,使用call_user_func_array就非常方便。

    0 0
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载