PHP中的call_user_func()与call_user_func_array()简单理解
call_user_func:把一个参数作为回调函数调用
用法说明:
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
参数说明:
第一个参数$callback作为回调函数,其它参数都是回调函数的参数。
$parameter:传入回调$callback函数的参数,这里的参数注意不能引用传递。
下面简单例子分别说明了在不同情况下使用call_user_func:
//先引用,后执行
function _call($call){
echo $call++.'<br/>';
echo $call++.'<br/>';
return $call;
}
$rs = call_user_func('_call',1);
var_dump($rs); //结果
//1
//2
//int(3)
先执行,后引用
$arg = 1;
call_user_func(function ($call){
echo ++$call.'<br/>';
echo ++$call.'<br/>';
},$arg); //结果为2,3
回调函数不传值,通过func_get_arg和func_get_args获取参数
$argOne = 1;
$argTwo = 2;
call_user_func(function (){
//获取第几个参数
$arg = func_get_arg(0);
var_dump($arg);
echo '<br/>';
//获取所有的参数,并以数组的形式返回
$args = func_get_args();
var_dump($args);
//获取参数个数
$argNum = func_num_args();
echo "<br/>";
var_dump($argNum);
},$argOne,$argTwo); //结果为
int(1)
array(2) { [0]=> int(1) [1]=> int(2) }
int(2)
调用类方法:
调用类中的静态方法有两种形式,而调用public方法第一个参数只能为数组
class Func{
static public function _One(){
$str = "THE CLASS NAME IS".__CLASS__." AND CLASS STATIC METHOD IS ".__METHOD__;
$argNum = func_num_args();
if($argNum){
$arg = func_get_arg(0);
return $str.' and argument is '.$arg;
}else{
return $str;
}
}
public function _Two($num){
return $num ? $num + 1 : $num;
}
}
echo "<br/>";
//调用类的静态方法
var_dump(call_user_func('Func::_One','one'));
echo '<br/>';
var_dump(call_user_func(['Func','_One']));
$num = 4;
$o = new Func;
//调用类普通方法
$return = call_user_func(array($o,'_Two'),$num);
echo '<br/>';
var_dump($return);
结果:
string(79) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One and argument is one"
string(59) "THE CLASS NAME ISFunc AND CLASS STATIC METHOD IS Func::_One"
int(5)
调用有命名空间的类时call_user_func的用法与上面的同理
//调用静态方法
call_user_func(array(__NAMESPACE__.'\StaticDemo','_One'),100);
call_user_func('App\StaticDemo::_One',200);
//调用public方法
call_user_func(array($obj,'_Two'),2,3,4);
最后:
和call_user_func函数类似的还有call_user_func_array,call_user_func_array的作用和call_user_func的作用一样,
不同的是call_user_func用回调函数处理字符,而call_user_func_array用回调处理数组,也就是说call_user_func_array的参数二只能为数组。
PHP中的call_user_func()与call_user_func_array()简单理解的更多相关文章
- C#中的索引器的简单理解和用法
索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了数组和集合成员时,索引器 ...
- Java泛型中的类型擦除机制简单理解
Java的泛型是JDK1.5时引入的.下面只是简单的介绍,不做深入的分析. Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首 ...
- python中的__name__=='__main__'如何简单理解(一)
1. 摘要: 通俗的理解_name_ == '_main_':假如你叫小明.py,在朋友眼中,你是小明(_name_ == '小明'):在你自己眼中,你是你自己(_name_ == '_main_') ...
- PHP 回调函数call_user_func和 call_user_func_array()的理解
call_user_func(function,param); // 第一个参数是回调函数的函数名,第二个参数是参数 call_user_func函数类似于一种特别的调用函数的方法.其主要有以下的类型 ...
- Javascript的堆和栈的简单理解
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
- php中call_user_func 与 call_user_func_array的使用
call_user_func()是利用回调函数处理字符串,call_user_func_array是利用回调函数处理数组. // 1. 调用自定义函数 function test($a, $b) { ...
- input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has
input屏蔽历史记录 设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处 ;(function($){$.ex ...
随机推荐
- Android Viewpager+Fragment实现滑动标签页
ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应. 主页布局 <?xml version="1.0" ...
- iframe内存释放
Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成.另一方面, 相关资料称IE在iframe元素的回收方面存在 ...
- LeetCode题解之Intersection of Two Linked Lists
1.题目描述 2.问题分析 使用unordered_set 将链表A中的节点地址全部插入,然后使用链表B中的每个节点在A中查找. 3.代码 ListNode *getIntersectionNode( ...
- 浅谈Java——泛型DAO
首先解释一下为什么要学习泛型DAO.平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法.当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是 ...
- Vue2学习笔记:v-show指令
v-show指令:v-show="true/false" 控制元素显示/隐藏 1.使用 <!DOCTYPE html> <html> <head> ...
- MySQL8.0初体验
MySQL8.0的官方社区开源版出来有段时间了,而percona的8.0版本还没有正式对外发布(已发布测试版),一直以来也没安装体验下这个号称质的飞跃的版本,今天正好有些时间就下了安装体验体验. 一. ...
- 使用SDWebImage淡入淡出的方式加载图片
使用SDWebImage淡入淡出的方式加载图片 效果: 请通过以下方式下载源码: 找到它修改文件的地方: 以下是使用源码: // // ViewController.m // SDWebImageFa ...
- CentOS针对磁盘IO[jdb2进程]的优化
CentOS的jdb2进程总是沾满io,查了一些资料后才知道,这个问题源自系统bug,在此记录一下解决办法: 将高IO的磁盘,用以下参数remount即可 mount -t ext4 -o remou ...
- Spring 如何在 WEB 应用中使用
1. Spring 如何在 WEB 应用中使用 ? 1). 需要额外加入的 jar 包: spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEAS ...
- [微信小程序直播平台开发]___(二)Nginx+rtmp在Windows中的搭建
1.一个可以忽略的前言 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramble ...