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
?>
官方手册内容如下:

PHP函数call_user_func和call_user_func_array详解的更多相关文章
- php自定义函数call_user_func和call_user_func_array详解
		
看UCenter的时候有一个函数call_user_func,百思不得其解,因为我以为是自己定义的函数,结果到处都找不到,后来百度了一下才知道call_user_func是内置函 call_user_ ...
 - php回调函数call_user_func和call_user_func_array详解
		
call_user_func($fun); call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下: 1.调用 普通函数: <?php function a($b, $c ...
 - PHP回调函数call_user_func()和call_user_func_array()的使用
		
call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...
 - JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function
		
html +css 静态页面 js 动态 交互 原理: js就是修改样式, 比如弹出一个对话框. 弹出的过程就是这个框由disable 变成display:enable. 又或者当鼠标指向 ...
 - WordPress函数:get_bloginfo()用法详解
		
描述 返回你博客的信息,这些信息可以用在任何地方的 PHP 代码中.这个函数,和 bloginfo() 一样,可以用来在模板文件的任何地方显示你博客的信息. 用法 <?php $bloginfo ...
 - Wordpress菜单函数wp_nav_menu各参数详解及示例
		
Wordpress菜单函数wp_nav_menu各参数详解及示例 注册菜单 首先要注册菜单,将以下函数添加至function.php函数里 register_nav_menus(array( ...
 - Delphi  Format函数功能及用法详解
		
DELPHI中Format函数功能及用法详解 DELPHI中Format函数功能及用法详解function Format(const Format: string; const Args: array ...
 - Linux C 字符串函数 sprintf()、snprintf() 详解
		
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
 - [转载]Linux C 字符串函数 sprintf()、snprintf() 详解
		
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
 
随机推荐
- 【2016-11-7】【坚持学习】【Day22】【Oracle 分页查询】
			
方法1: select * from (select rownum rn, temp.* from ( +sqlText+ ) temp ) where rn > "+ start + ...
 - faster_rcnn c++版本的 caffe 封装(1)
			
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 由于需要把FasterRCNN做的工程化,因此这里需要对Caff ...
 - POJ1201 Intervals[差分约束系统]
			
Intervals Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26028 Accepted: 9952 Descri ...
 - 第37课 深度解析QMap与QHash
			
1. QMap深度解析 (1)QMap是一个以升序键顺序存储键值对的数据结构 ①QMap原型为 class QMap<K, T>模板 ②QMap中的键值对根据Key进行了排序 ③QMap中 ...
 - 使用python实现appium的屏幕滑动
			
前些日子写一个滑动手机页面的小脚本,看到大家给的内容都是swipe方法,这里对swipe方法做一个小介绍: Swipe(int start x,int start y,int end x,int y, ...
 - on事件委托
			
on绑定多个事件,off解绑事件,one事件只执行一次 on除了能够处理未来事件,还可以对事件进行委托处理 $('div').on('click', 'p', function(event)(也就是通 ...
 - iOS修改TextField占位符颜色大小
			
UITextField *addCtrolField = [[UITextField alloc]initWithFrame:CGRectMake(CGRectGetMaxX(rightTitleLa ...
 - ES5基础之正则表达式01:初次见面
			
1.正则初次见面 测试地址:https://regexper.com 第一个正则:匹配 2006-10-11 或 2006/10/11 var reg = /^\d{4}[-/]\d{2}[-/]\d ...
 - 我也来写:数据库访问类DBHelper
			
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
 - Jumony Core 3,真正的HTML引擎,正式版发布
			
Jumony是一个开源项目,已经有三年的历史了,在这三年中,秉承提供给.NET程序员完整的HTML掌控能力,Jumony历经无数次的改进,终于进入了一个新的阶段.Jumony Core 3是一个真正意 ...