PHP函数call_user_func和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 parameters
Description
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 debug($var, $val) {echo "***DEBUGGING
VARIABLE: $var
VALUE:";if (is_array($val) || is_object($val) || is_resource($val)) {print_r($val);} else {echo "
$val
";}echo "***
";
}$c = mysql_connect();
$host = $_SERVER["SERVER_NAME"];call_user_func_array('debug', array("host", $host));
call_user_func_array('debug', array("c", $c));
call_user_func_array('debug', array("_POST", $_POST));
?>
相信看了例子之后应该有点明白了吧?
我自己是这么理解这个函数的,如果说的不对,还望各位高手不要耻笑:
该函数真正的用法有点类似于函数重载,因为他的第一个参数是字符型的,也就是函数的名称,第二个参数是数组,我们可以当成该函数的各个参数,而事实上也就是这么用的,如果你看过我的前一篇文章:PHP的伪重载 ,或许你能够理解,正是因为这个函数的存在,我发现函数重载也可以这样运用:
<?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的伪重载一文中有所提及,仅作参考。。。。
这些只是call_user_func_array的简易用法,在PHP4下测试过,而手册中还有一些将第一个参数当成数组来传入的例子,我在PHP4下是没有办法运行的,也许PHP5可以吧,但我不用PHP5的,也没有办法解释什么。谢谢各位
PHP函数call_user_func和call_user_func_array详解
call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下:
1.调用 普通函数:
<?php
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,也是满有新意的:
2.调用 类的方法(包括类的静态的方法与实例对象方法)
<?php
class a {function b($i) {echo $i;}public static c($k) {echo $k;}
}//当php <5.3时,可以如下使用,此时会把 b()方法当作是a的一个静态方式。
call_user_func(array("a", "b"), "111");//当php >=5.3时,类的公开的非静态的方法必须在类实例化后方可被调用,否则会提示Strict性错误(为了兼容先前及以后的版本,还是用对象方法传入)。
$obj = new a;
call_user_func(array($obj, "b"), "111");//显示 111//静态方法可以如下方式调用
call_user_func(array("a", "b"), "111");
//或
call_user_func("a::b","111");
?>
call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:
<?php
function a($b, $c) {echo $b;echo $c;}call_user_func_array('a', array("111", "222"));
//显示 111 222
?>
call_user_func_array 函数也可以调用类内部的方法的,只不过是后面传参要以数组的形式传入而已。
<?php
Class ClassA
{function bc($b, $c) {$bc = $b + $c;echo $bc;}function d() {$bc = $b + $c;echo $bc;}
}//php<5.3时,非静态的方法可直接传入类名
call_user_func_array(array('ClassA', 'bc'), array("111", "222"));//php>=5.3时,非静态的方法 只有在类被实例化后方可调用,否则会提示Strict性错误
$obj = new classA;
call_user_func_array(array($obj, 'bc'), array("111", "222"));//静态方法调用如下
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//或
call_user_func_array('ClassA::bc', array("111", "222"));
?>
call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:
<?php
function a(&$b) {$b++;
}$c = 0;
call_user_func('a', &$c);//注意,5.*版本中,call_user_func不提倡引用传递,提示已过时。
echo $c;//显示 1
call_user_func_array('a', array(&$c));
echo $c;//显示 2
?>
官方手册内容如下:
转载于:https://www.cnblogs.com/52php/p/5659978.html
PHP函数call_user_func和call_user_func_array详解相关推荐
- 在python中使用关键字define定义函数_python自定义函数def的应用详解
这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...
- 函数assert()详解
函数assert()详解: 断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式.预处理器产生测试该断言的代码,如果断言不为真, ...
- php。defined,PHP defined()函数的使用图文详解
PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...
- python中tile的用法_python3中numpy函数tile的用法详解
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...
- Delphi Format函数功能及用法详解
DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...
- python中的json函数_python中装饰器、内置函数、json的详解
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
- 如何使用指向类的成员函数的指针(详解!)
原文:如何使用指向类的成员函数的指针(详解!) 另外一篇英文参考:Member Function Pointers and the Fastest Possible C++ Delegates 我们首 ...
- php时间函数引入,PHP日期和时间函数的使用示例详解
(1)查看日期函数拓展 phpinfo() phpinfo(); 打开上述页面之后,可以看到以下,证明已经安装日期拓展 浏览器输入php.net访问php的文档 (2)设置时区 方式一:修改配置文件p ...
- python def函数报错详解_python自定义函数def的应用详解
这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...
最新文章
- currenttimemillis 毫秒还是秒_Elasticsearch(ES)如何做到亿级数据查询毫秒级返回
- About me 留言板
- 复习笔记(三)——C++类和对象
- 使用奇异值谱分析鉴定振荡成份
- Redis 命令--Redis集合(Set)
- Istio入门:架构原理及在k8s部署
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
- CSP-S/J2019认证相关内容
- zuul 自定义策略_如何为您的社区定义指标策略
- jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...
- XOS 源码详解3: os_s_xxxx.s 汇编代码的 LDR指令
- Hibernate学习之createSQLQuery与createQuery的区别及使用
- lombak-插件使用
- java form上传图片_js formData图片上传(单图上传、多图上传)后台java
- 相干检测--概念,原理,科斯塔斯环
- Android之线性布局的4个重要参数
- 清除HTML的超链接样式,Markdown导出HTML,删除超链接下划线和字体样式
- 叶俊在深圳天长地久集团培训会上谈到“唤醒沟通力与工匠精神”
- Tracy JS 小笔记 - 数据结构 栈,队列,链表,字典,集合,哈希表(散列表)
- iphone 控制android手机,如何从Apple手机远程控制Android手机
热门文章
- SuperMap IS.NET保存地图之Ajax篇(转)
- asp.net mvc 2被遗忘的%:Html.AntiForgeryToken() %
- LeetCode 5352. 生成每种字符都是奇数个的字符串
- 用BP神经网络预测虫害
- Git commit至Gitee报错‘remote: error: hook declined to update refs/heads/master‘的解决方法
- 智能云端服务器连接不了,智能云解析,智能在哪里?
- 用心摘种一树技能,植树节送3本书
- 测试面试题集-Dubbo常见面试题
- 嘉楠发布阿瓦隆浸入式冷却矿机A1066I
- Cover Protocol更新赔偿计划 新增三个新COVER代币获赔方