文档章节

ecmall和discuz的源码中大量使用的函数,call_user_func_array详解

glen2012
 glen2012
发布于 2017/03/23 11:41
字数 459
阅读 16
收藏 0

在ecmall和discuz的源码中大量使用这个call_user_func_array,不得不认真看看它的使用方法了。简单来讲,就是调用一个函数或者一个类中的某个成员函数。手册上的原型是这样的:

mixed call_user_func_array ( callable $callback , array $param_arr )

第一个参数是函数名,第二个参数是参数数组,返回值是大杂烩。
写俩个demo来看看就知道了

动态调用普通函数时,在这种情况下也是很有作用:

 
  1. function a($b, $c)
  2. {
  3. echo $b;
  4. echo $c;
  5. }
  6. call_user_func_array('a', array("111", "222"));
  7. //显示 111 222

当动态调用类的静态方法时它还是有作用的:

 
  1. Class ClassA
  2. {
  3. function bc($b, $c) {
  4. $bc = $b + $c;
  5. echo $bc;
  6. }
  7. }
  8. call_user_func_array(array('ClassA','bc'), array("111", "222"));
  9. //显示 333

在ecmall的\includes\ecapp.base.php里面有一段:

 
  1. /**
  2. * 显示错误警告
  3. *
  4. * @author Garbin
  5. * @param none
  6. * @return void
  7. */
  8. function show_warning()
  9. {
  10. $args = func_get_args();
  11. call_user_func_array('show_warning', $args);
  12. }

实际上这个show_message()函数最终是eccore/controller/messages.base.php文件中定义的:

 
  1. /**
  2. * send a system warning message
  3. *
  4. * @param string $msg
  5. */
  6. function show_warning ($msg)
  7. {
  8. $a = _trigger_message(func_get_args());
  9.  
  10. _message(serialize($a), E_USER_WARNING);
  11. }

这里的func_get_args将变量数组取出来,也就是得到上面的$args了。

当然你会觉得,直接调用不就得了。何必这么麻烦,写这么复杂。所以我举个例子,就知道这个函数的好处了。

函数的变量的个数不确定的时候,调用这个函数是非常的好用的。

 
  1. function playVideo($video)
  2. {
  3. echo '哥在用用Video看电影-',$video;
  4. }
  5.  
  6. function playAudio($artist,$music)
  7. {
  8. echo '哥在用Mp3听',$artist,'的歌-',$music;
  9. }
  10.  
  11. function play()
  12. {
  13. $args = func_get_args();
  14.  
  15. $functionName = array_shift($args);
  16.  
  17. call_user_func_array( 'play'.$functionName, $args );
  18. }
  19.  
  20. play('Video','《功夫》');
  21.  
  22. play('Audio', 'Jay','《简单爱》');

使用场景:

1、你要调用的函数名是未知的

2、要调用函数的参数类型及个数也是未知的

因为未知,所以得用call_user_func_array这样的函数。

本文转载自:http://www.liaoxiansheng.cn/

glen2012
粉丝 1
博文 6
码字总数 2097
作品 0
泉州
私信 提问
Laravel5.3之函数处理(Function Handling)

说明:Laravel中经常使用PHP的来设计代码,本文主要学习PHP的特性,来提高写代码时的设计质量。PHP提供了一些函数处理操作的内置函数,主要有: Function Handling calluserfuncarray()/callu...

botkenni
2016/11/15
27
0
Macroable 宏指令详解

百度百科的定义: 计算机科学里的宏(Macro),是一种批量处理的称谓。一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的...

echojson
04/01
11
0
ecmall widgets 挂件开发详解

Ecmall挂件开发 实质上是后台开发很多页面,分别去调用程序展示这些页面,达到首页内容更换很快的目的,这样做减少后续开发,开发人员只需开发挂件就可以了,至于位置可随意定.(还需调整htm...

wensongyu
2013/12/11
0
0
详解discuz源码

打开代码: 敲击:admin.php define('IN_ADMINCP', TRUE); //定义常量IN_ADMINCP为true 这样在后面的每个页面都会判断 if(!defined('INDISCUZ') || !defined('INADMINCP')) { exit('Access D......

crossmix
2015/10/24
1K
0
第二天,仔细学习了下:common.inc.php(Discuz6.1.0核心文件)02

fetcharray($query)) {//运行上面的sql语句,然后将结果存入$_DSESSION数组 $sessionexists = 1;//将$sessionexists赋值为1 if(!emptyempty($_DSESSION['sessionuid'])) { $DSESSION......

技术小胖子
2017/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部