使用call_user_func_array()来回调执行函数与直接使用函数的区别是什么?
Jun 06, 2016 pm 08:46 PM
对比了半天还是没发现有什么太大的区别,可能是我没有找到体现出使用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','《简单爱》');
回复内容:
对比了半天还是没发现有什么太大的区别,可能是我没有找到体现出使用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','《简单爱》');
我一般也很少用到这个函数,但是当动态调用类的静态方法时它还是有作用的:
<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这样的函数。
一个应用场景:
定时任务类需要定时运行一个函数,则接口就可以类似这样设计:
/** * 在$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就非常方便。

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian

Comment configurer Visual Studio Code (VS Code) pour le développement PHP
