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脚本[带参数]的方法
Jan 22 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
PHP遍历数组的几种方法
Mar 22 PHP
2014最热门的24个php类库汇总
Dec 18 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
Oct 16 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php查询whois信息的方法
2015/06/08 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
JS实现简单日历特效
2020/01/03 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python中apply函数的用法实例教程
2014/07/31 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Python-opencv 双线性插值实例
2020/01/17 Python
Python Django view 两种return的实现方式
2020/03/16 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
诚信考试倡议书
2014/04/15 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
保护环境建议书100字
2014/05/13 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
师德师风整改措施
2014/10/24 职场文书
个人年度总结报告
2015/03/09 职场文书
女性健康知识讲座通知
2015/04/23 职场文书