今天在群里面,有个叫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详解相关推荐

  1. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  2. 函数assert()详解

    函数assert()详解: 断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式.预处理器产生测试该断言的代码,如果断言不为真, ...

  3. php。defined,PHP defined()函数的使用图文详解

    PHP defined()函数的使用图文详解 PHP defined() 函数 例子 定义和用法 defined() 函数检查某常量是否存在. 若常量存在,则返回 true,否则返回 false. 语 ...

  4. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  5. Delphi Format函数功能及用法详解

    DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...

  6. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  7. 如何使用指向类的成员函数的指针(详解!)

    原文:如何使用指向类的成员函数的指针(详解!) 另外一篇英文参考:Member Function Pointers and the Fastest Possible C++ Delegates 我们首 ...

  8. php时间函数引入,PHP日期和时间函数的使用示例详解

    (1)查看日期函数拓展 phpinfo() phpinfo(); 打开上述页面之后,可以看到以下,证明已经安装日期拓展 浏览器输入php.net访问php的文档 (2)设置时区 方式一:修改配置文件p ...

  9. python def函数报错详解_python自定义函数def的应用详解

    这篇文章主要介绍了python自定义函数def的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 这里是三岁,来和大家唠唠 ...

最新文章

  1. currenttimemillis 毫秒还是秒_Elasticsearch(ES)如何做到亿级数据查询毫秒级返回
  2. About me 留言板
  3. 复习笔记(三)——C++类和对象
  4. 使用奇异值谱分析鉴定振荡成份
  5. Redis 命令--Redis集合(Set)
  6. Istio入门:架构原理及在k8s部署
  7. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
  8. CSP-S/J2019认证相关内容
  9. zuul 自定义策略_如何为您的社区定义指标策略
  10. jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...
  11. XOS 源码详解3: os_s_xxxx.s 汇编代码的 LDR指令
  12. Hibernate学习之createSQLQuery与createQuery的区别及使用
  13. lombak-插件使用
  14. java form上传图片_js formData图片上传(单图上传、多图上传)后台java
  15. 相干检测--概念,原理,科斯塔斯环
  16. Android之线性布局的4个重要参数
  17. 清除HTML的超链接样式,Markdown导出HTML,删除超链接下划线和字体样式
  18. 叶俊在深圳天长地久集团培训会上谈到“唤醒沟通力与工匠精神”
  19. Tracy JS 小笔记 - 数据结构 栈,队列,链表,字典,集合,哈希表(散列表)
  20. iphone 控制android手机,如何从Apple手机远程控制Android手机

热门文章

  1. SuperMap IS.NET保存地图之Ajax篇(转)
  2. asp.net mvc 2被遗忘的%:Html.AntiForgeryToken() %
  3. LeetCode 5352. 生成每种字符都是奇数个的字符串
  4. 用BP神经网络预测虫害
  5. Git commit至Gitee报错‘remote: error: hook declined to update refs/heads/master‘的解决方法
  6. 智能云端服务器连接不了,智能云解析,智能在哪里?
  7. 用心摘种一树技能,植树节送3本书
  8. 测试面试题集-Dubbo常见面试题
  9. 嘉楠发布阿瓦隆浸入式冷却矿机A1066I
  10. Cover Protocol更新赔偿计划 新增三个新COVER代币获赔方