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 中文处理函数集合
Aug 27 PHP
PHP Squid中可缓存的动态网页设计
Sep 17 PHP
PHP 读取文件的正确方法
Apr 29 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
PHP创建/删除/复制文件夹、文件
May 03 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
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脚本的10个技巧(7)
2006/10/09 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
python文件选择对话框的操作方法
2019/06/27 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
Java如何格式化日期
2012/08/07 面试题
护士检查书
2014/01/17 职场文书
21岁生日感言
2014/02/27 职场文书
葛优非诚勿扰搞笑征婚台词
2014/03/17 职场文书
业务员岗位职责范本
2015/04/03 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
SQL Server表分区降低运维和维护成本
2022/04/08 SQL Server
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android