php自定义函数call_user_func和call_user_func_array详解


Posted in PHP onJuly 14, 2011

call_user_func函数类似于一种特别的调用函数的方法,使用方法如下:

function a($b,$c) 
{ 
echo $b; 
echo $c; 
} 
call_user_func('a', "111","222"); 
call_user_func('a', "333","444"); 
//显示 111 222 333 444 
?>

调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:
class a { 
function b($c) 
{ 
echo $c; 
} 
} 
call_user_func(array("a", "b"),"111"); 
//显示 111 
?>

call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:
function a($b, $c) 
{ 
echo $b; 
echo $c; 
} 
call_user_func_array('a', array("111", "222")); 
//显示 111 222 
?>

call_user_func_array函数也可以调用类内部的方法的
Class ClassA 
{ 
function bc($b, $c) { 
$bc = $b + $c; 
echo $bc; 
} 
} 
call_user_func_array(array('ClassA','bc'), array("111", "222")); 
//显示 333 
?>

call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:
function a(&$b) 
{ 
$b++; 
} 
$c = 0; 
call_user_func('a', &$c); 
echo $c;//显示 1 
call_user_func_array('a', array(&$c)); 
echo $c;//显示 2

php之call_user_func_array的简易用法
今天在群里面,有个叫lewis的在问call_user_func_array的用法,因为之前一直没有用过,也不能说什么,于是看一下手册,发现是这么写的:
call_user_func_array
(PHP 4 >= 4.0.4, PHP 5)
call_user_func_array -- Call a user function given with an array of parametersDescription
mixed call_user_func_array ( callback function, array param_arr )
Call a user defined function given by function, with the parameters in param_arr.
然后还有一个例子:
<?php 
function foobar($arg, $arg2) { 
echo __FUNCTION__, " got $arg and $arg2\n"; 
} 
class foo { 
function bar($arg, $arg2) { 
echo __METHOD__, " got $arg and $arg2\n"; 
} 
} 
// Call the foobar() function with 2 arguments 
call_user_func_array("foobar", array("one", "two")); 
// Call the $foo->bar() method with 2 arguments 
$foo = new foo; 
call_user_func_array(array($foo, "bar"), array("three", "four")); 
?>

以上例程的输出类似于:
foobar got one and two
foo::bar got three and four
Example #2 call_user_func_array() using namespace name
<?php 
namespace Foobar; 
class Foo { 
static public function test($name) { 
print "Hello {$name}!\n"; 
} 
} 
// As of PHP 5.3.0 
call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes')); 
// As of PHP 5.3.0 
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip')); 
?>

以上例程的输出类似于:
Hello Hannes!
Hello Philip!
Example #3 Using lambda function
<?php 
$func = function($arg1, $arg2) { 
return $arg1 * $arg2; 
}; 
var_dump(call_user_func_array($func, array(2, 4))); /* As of PHP 5.3.0 */ 
?>

以上例程会输出:
int(8)
相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:
/** 
* 例子写完后,本来认为完事了,结果遇到有人问call_user_func_array(),看了一下手册 
* 原来,我上面的那个test函数还可以精简成如下的例子, 
*/ 
function otest1 ($a) 
{ 
echo( '一个参数' ); 
} 
function otest2 ( $a, $b) 
{ 
echo( '二个参数' ); 
} 
function otest3 ( $a ,$b,$c) 
{ 
echo( '三个啦' ); 
} 
function otest () 
{ 
$args = func_get_args(); 
$num = func_num_args(); 
call_user_func_array( 'otest'.$num, $args ); 
} 
otest(1,2);

看到不?而我最初的写法,在PHP的伪重载一文中有所提及,仅作参考。。。。
PHP 相关文章推荐
PHP新手上路(八)
Oct 09 PHP
PHP编码规范-php coding standard
Mar 16 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
php生成xml简单实例代码
Dec 16 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
Yii使用技巧大汇总
Dec 29 PHP
PHP弱类型语言中类型判断操作实例详解
Aug 10 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 #PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 #PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 #PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 #PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 #PHP
php array_map()数组函数使用说明
Jul 12 #PHP
php array_walk() 数组函数
Jul 12 #PHP
You might like
php 读取文件乱码问题
2010/02/20 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
js操作二进制数据方法
2018/03/03 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
python模拟实现分发扑克牌
2020/04/22 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
军训感想500字
2014/02/20 职场文书
总经理任命书范本
2014/06/05 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript