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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
彻底杜绝PHP的session cookie错误
Aug 09 PHP
PHP中Date()时间日期函数的使用方法小结
Apr 20 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
php导出excel格式数据问题
Mar 11 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
php图片添加文字水印实现代码
Mar 15 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
简单实现php上传文件功能
Sep 21 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 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使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
微信小程序自定义组件
2017/08/16 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
详解Node.js中的Async和Await函数
2018/02/22 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
Python中删除文件的程序代码
2011/03/13 Python
Python中属性和描述符的正确使用
2016/08/23 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
给物业的表扬信
2014/01/21 职场文书
毕业评语大全
2014/05/04 职场文书
golang日志包logger的用法详解
2021/05/05 Golang