ホームページ  >  記事  >  バックエンド開発  >  使用call_user_func_array()来回调执行函数与直接使用函数的区别是什么?

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

WBOY
WBOYオリジナル
2016-06-06 20:46:161162ブラウズ

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

<code class="lang-php">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);
</code>

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

<code class="lang-php">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','《简单爱》');
</code>

回复内容:

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

<code class="lang-php">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);
</code>

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

<code class="lang-php">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','《简单爱》');
</code>

我一般也很少用到这个函数,但是当动态调用类的静态方法时它还是有作用的:

<code>class foo
{
    public static function func() 
    {
        var_dump(func_get_args());
    }
}

call_user_func_array(array('foo', 'func'), array('hello world'));
</code>

至于动态调用普通函数时,在这种情况下也是很有作用:

<code>function playVideo($type, $src)
{
    echo 'I will watch '.$src;
}

function playAudio($type, $src, $artist)
{
    echo 'I will listen to '.$artist.'\'s'.$src;
}

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

     call_user_func_array( 'play'.$args[0], $args  );
}

play('Video','功夫.rmvb');

echo " and ";

play('Audio','简单爱.mp3', 'Jay');
</code>

我相信你现在已经明白它的作用了。此外,call_user_func()call_user_func_array() 类似,只不过后者第二个参数传入的是数组而已。

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

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

<code class="lang-php">/**
 * 在$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);
    }
}
</code>

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。