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 ...
随机推荐
- Condition使用
面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, 能够支持2个生产者线程以及10个消费者线程的阻塞调用 有两种方法 1.使用wait和notify/notify ...
- java boolean 值在内存中占几位?
java boolean 值在内存中占几位? <Java虚拟机规范>中这样描述:虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持.在Java虚拟机中没有任何供 ...
- 带你从零学ReactNative开发跨平台App开发(三)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- Eigen 学习之块操作
Eigen 为 Matrix .Array 和 Vector提供了块操作方法.块区域可以被用作 左值 和 右值.在Eigen中最常用的块操作函数是 .block() . block() 方法的定义如 ...
- HDFS pipeline写 -- 客户端
上一篇说了datanode端如何处理pipeline写请求的,这里主要看DFSClient. 这里以append为例, write差不多. 创建一个pipeline用于append操作的流程: Fil ...
- Oracle EBS 应收事务处理取值
SELECT ct.org_id ,ct.attribute1 bu_id --核算主体编号 ,ct.attribute2 dept_id --部门编号 ,hca.account_number ,hp ...
- 初始Flask
一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask 主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架 Flask是一个基于P ...
- [UI] 精美UI界面欣赏[9]
精美UI界面欣赏[9]
- SpringBoot Mybatis 执行自定义SQL
1.XML中执行自定义SQL. https://blog.csdn.net/u012427355/article/details/80654806 2.注解执行自定义SQL @Select(" ...
- idea指定SpringBoot启动.properties文件
比如我的项目下有2个.properties文件,一个是application.properties,一个是application-local.properties,在本地的时候想指定用applicat ...