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 相关文章推荐
某大型网络公司应聘时的笔试题目附答案
Mar 27 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
yii添删改查实例
Nov 16 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
PHP实现时间比较和时间差计算的方法示例
Jul 24 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
php curl操作API接口类完整示例
May 21 PHP
零基础php编程好学吗
Oct 11 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
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
php 使用array函数实现分页
2015/02/13 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
javascript新手语法小结
2008/06/15 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
弄虚作假心得体会
2014/09/10 职场文书
小平您好观后感
2015/06/09 职场文书
商场广播稿范文
2015/08/19 职场文书
提档介绍信范文
2015/10/22 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
JS实现扫雷项目总结
2021/05/19 Javascript
利用python进行数据加载
2021/06/20 Python