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实现MySQL更新记录的代码
Jun 07 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
php求两个目录的相对路径示例(php获取相对路径)
Mar 27 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
ThinkPHP查询中的魔术方法简述
Jun 25 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
thinkphp的dump函数无输出实例代码
Nov 15 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
destoon公司主页模板风格的添加方法
2014/06/20 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
2016/08/17 PHP
PHP7 标准库修改
2021/03/09 PHP
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
python中__slots__用法实例
2015/06/04 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
考试不及格检讨书
2014/01/09 职场文书
大学生村官承诺书
2014/03/28 职场文书
尊师重教演讲稿
2014/09/04 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
荒岛余生观后感
2015/06/09 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python