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单件模式结合命令链模式使用说明
Sep 07 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
Apache中php.ini的设置方法
Feb 28 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
yii2简单使用less代替css示例
Mar 10 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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执行速度全攻略
2006/10/09 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
小结Python用fork来创建子进程注意事项
2014/07/03 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
python实现大转盘抽奖效果
2019/01/22 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
化工专业推荐信范文
2013/11/28 职场文书
应届毕业生求职信范例分享
2013/12/17 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
村干部培训方案
2014/05/02 职场文书
设备收款委托书范本
2014/10/02 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
陪护人员误工证明
2015/06/24 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android