使用 call_user_func_array() 来回调执行函数和直接调用函数的区别是什么?
2015-06-08 17:48
573 查看
<?php header("Content-type:text/html;charset=utf-8"); function test($name, $age) { echo $name . ' == ' . $age . '<br />'; } test('小花', 18); // 直接调用 call_user_func_array('test', array('小花', 18)); // 使用 call_user_func_array
对比了半天觉得根本没必要用 call_user_func_array() 函数,直接调用反而更方便!
但是如果场景是这样的:
1、你要调用的函数名是未知的(PHP 支持变量调用函数和类,如 <?php $a = 'test'; $a(); ?>,所以这个不算 call_user_func_array() 函数的优势)
2、要调用函数的参数类型及个数也是未知的(这个才是使用 call_user_func_array() 函数最有优势的地方!)
<?php header("Content-type:text/html;charset=utf-8"); function playVideo($type, $src) { echo "{$type} : I will watch {$src}<br />"; } function playAudio($type, $src, $artist) { echo "{$type} : I will listen to {$artist}'s {$src}<br />"; } function play() { $args = func_get_args(); call_user_func_array('play'.$args[0], $args); // PHP 支持变量调用函数和类 // $func_name = 'play'.$args[0]; // $func_name($args[0], $args[1]); // 参数个数不确定,playVideo 需要 2 个参数,playAudio 需要 3 个参数,而 call_user_func_array 直接传递参数数组就完全不用考虑这个问题了 // call_user_func('play'.$args[0], $args[0], $args[1]); // 和上面参数个数的缺点一样,所以最好使用 call_user_func_array 函数 } play('Video','功夫.rmvb'); play('Audio','简单爱.mp3', 'Jay');
还有个场景,在调用对象的方法时使用 call_user_func_array() 函数可能稍微简洁些吧:
<?php header("Content-type:text/html;charset=utf-8"); class Test { public function a() { $args = func_get_args($name, $age); echo "{$name}今年{$age}岁了! <br />"; } } // 很简洁 call_user_func_array(array(new Test(),'a'), array('小花', 18)); // 直接调用稍微麻烦些 $test = new Test(); $test->a('小花', 18); // php 不支持 new class()->method() 语法
在类方法参数个数不确定时,还是得使用 call_user_func_array() !
参考:http://segmentfault.com/q/1010000000469520
相关文章推荐
- 编程范式与语言
- 玩转iOS开发 - JSON 和 Xml 数据解析
- Android 调用本地通讯录,广播接收
- 1002-HBase本地安装方式
- 51nod:天堂里的游戏
- Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别
- 光华管理学院学生研究报告-关于速表创业
- 51nod:天堂里的游戏
- extjs 4.2 高度自适应
- 黑马程序员——Java基础---Date/ Calender
- nsis入门精解教程
- Ext.Msg.show
- 玩转iOS开发 - 视图控制器生命周期
- 查看mysql表结构和表创建语句的方法
- 1001-HBase基本概念
- Qt学习之路(17): Qt标准对话框之QMessageBox
- 如何管理项目需求?统御需求管理软件oBridge
- SDUT 1214 天仙配
- MySQL基础命令
- MySql用户权限配置管理--查看,赋予,回收(GRANT,REVOKE)