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 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
phpinfo 系统查看参数函数代码
Jun 05 PHP
php无限极分类实现的两种解决方法
Apr 28 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
php实现Session存储到Redis
Nov 11 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
Laravel中如何增加自定义全局函数详解
May 09 PHP
PHP那些琐碎的知识点(整理)
May 20 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
jquery动态遍历Json对象的属性和值的方法
2016/07/27 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
JS性能优化实现方法及优点进行
2020/08/30 Javascript
python制作mysql数据迁移脚本
2019/01/01 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
原生python实现knn分类算法
2019/10/24 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
物流仓储计划书
2014/01/10 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
爱情寄语大全
2014/04/09 职场文书
小学教师师德整改措施
2014/09/29 职场文书
欠条格式范本
2015/07/03 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书