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中的字符串函数
Nov 24 PHP
php 删除cookie和浏览器重定向
Mar 16 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
PHP输入流php://input介绍
Sep 18 PHP
PHPEXCEL 使用小记
Jan 06 PHP
php实现监听事件
Nov 06 PHP
理解PHP中的stdClass类
Apr 18 PHP
33道php常见面试题及答案
Jul 06 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 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获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
2009/10/25 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
js实现随机数小游戏
2019/06/28 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2016/01/20 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
python创建文本文件的简单方法
2020/08/30 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
医院办公室主任职责
2013/12/29 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
八年级英语教学反思
2014/01/09 职场文书
小学生作文评语大全
2014/04/21 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
金秋助学感谢信
2015/01/21 职场文书
出国留学单位推荐信
2015/03/26 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript