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 is_file 判断给定文件名是否为一个正常的文件
May 10 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
php禁止浏览器使用缓存页面的方法
Nov 07 PHP
详解PHP中的Traits
Jul 29 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
php数组遍历类与用法示例
May 24 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编写的导航条程序
2006/10/09 PHP
php计算年龄精准到年月日
2015/11/17 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
chrome原生方法之数组
2011/11/30 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
python下载文件时显示下载进度的方法
2015/04/02 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
大学生入党思想汇报
2014/01/14 职场文书
村长贪污检举信
2014/04/04 职场文书
大专生找工作自荐书
2014/06/10 职场文书
委托书如何写
2014/08/30 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
医生辞职信范文
2015/03/02 职场文书
化妆品促销活动总结
2015/05/07 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python