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 相关文章推荐
关于时间计算的结总
Dec 06 PHP
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
PHP实现事件机制实例分析
Jun 26 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
详细解读PHP中接口的应用
Aug 12 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 PHP
php中Swoole的热更新实现代码实例
Mar 04 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 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
玩转方法:call和apply
2014/05/08 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
2016/04/13 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JS中动态创建元素的三种方法总结(推荐)
2016/10/20 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
angular动态表单制作
2018/02/23 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
Python实现的文本编辑器功能示例
2017/06/30 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
Html5 audio标签样式的修改
2016/01/28 HTML / CSS
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
师范毕业生求职信
2014/07/11 职场文书
社区娱乐活动方案
2014/08/21 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
应急管理工作总结2015
2015/05/04 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python
Python 数据可视化之Bokeh详解
2021/11/02 Python
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android