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
Dec 14 PHP
fgetcvs在linux的问题
Jan 15 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
php牛逼的面试题分享
Jan 18 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 PHP
php调用C代码的实现方法
Mar 11 PHP
CI框架文件上传类及图像处理类用法分析
May 18 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP折半(二分)查找算法实例分析
May 12 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
Php Cookie的一个使用注意点
2008/11/08 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
js特效,页面下雪的小例子
2013/06/17 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Django rest framework实现分页的示例
2018/05/24 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python生成器推导式用法简单示例
2019/10/08 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
班长演讲稿范文
2014/04/24 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
告知书格式
2015/07/01 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
MySQL GRANT用户授权的实现
2021/06/18 MySQL
Java 异步任务计算FutureTask
2022/04/28 Java/Android
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS