使用call_user_func_array()來回調執行函數與直接使用函數的區別是什嗎?

來源:互聯網
上載者:User
對比了半天還是沒發現有什麼太大的區別,可能是我沒有找到體現出使用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 '
';play('Audio', 'Jay','《簡單愛》');

回複內容:

對比了半天還是沒發現有什麼太大的區別,可能是我沒有找到體現出使用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 '
';play('Audio', 'Jay','《簡單愛》');

我一般也很少用到這個函數,但是當動態調用類的靜態方法時它還是有作用的:

class foo{    public static function func()     {        var_dump(func_get_args());    }}call_user_func_array(array('foo', 'func'), array('hello world'));

至於動態調用普通函數時,在這種情況下也是很有作用:

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');

我相信你現在已經明白它的作用了。此外,call_user_func()call_user_func_array() 類似,只不過後者第二個參數傳入的是數組而已。

很多情境是這樣的:
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就非常方便。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.