對比了半天還是沒發現有什麼太大的區別,可能是我沒有找到體現出使用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就非常方便。