对比了半天还是没发现有什么太大的区别,可能是我没有找到体现出使用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就非常方便。