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脚本的10个技巧(3)
Oct 09 PHP
PHP获取当前文件所在目录 getcwd()函数
May 13 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
php防止sql注入的方法详解
Feb 20 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP常用函数之格式化时间操作示例
Oct 21 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 dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
ext combobox动态加载数据库数据(附前后台)
2014/06/17 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
css sprite简单实例
2016/05/23 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
外贸英语专业求职信范文
2013/12/25 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
上班迟到检讨书
2014/09/15 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
交通事故协议书范本
2016/03/19 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android