PHP call_user_func的一些用法和注意点
版本:PHP 5.6.28
在call_user_func的调用中:
1.参数的传递过程,并不是引用传值。
1 error_reporting(E_ERROR); // 此处不是E_ALL
2 $cur_value = 1;
3
4 function increment(&$var)
5 {
6 $var++;
7 }
8 echo 'Before value is :' .$cur_value. "\n";
9 call_user_func('increment',$cur_value);
10 echo 'After call call_user_func : ' .$cur_value. "\n";
在E_ALL的报告级别下,可以看到控制台的有此输出:
如果要引用传值,可以使用call_user_func_array ;
1 call_user_func_array('increment',array(&$cur_value));
2. PHP版本不大于5.3.0时,对面向对象里面的关键字的解析有所增强。在此之前,使用双引号来来连接一个类和里面的一个方法,把之作为参数来作为回调函数的会,将会发出一个 E_STRICT的警告,因为这个传入的参数被视为静态方法。
3. 变量函数比call_user_func效率高点,在一下的情况可以考虑使用call_user_func:
<?php
function say($content)
{
echo $content ."\n";
}
$content = 'Hello the world!';
$func = 'say'; echo 'Say the classic word one thousands times!' ."\n"; echo 'Called by the Variable Function' ."\n";
$start = microtime(true);
for($i = 0;$i < 10000;$i++)
{
$func($content);
}
$end = microtime(true);
$time1 = $end - $start; echo 'Called by the call_user_func function ' ."\n";
$start = microtime(true);
for($i = 0;$i < 10000;$i++)
{
call_user_func($func,$content);
}
$end = microtime(true);
$time2 = $end - $start; echo 'Variable Function Cost ' .$time1. ' microseconds!' ."\n";
echo 'Function of call_user_func Cost ' .$time2. ' microsecond!' ."\n";
win10终端输出:
phpstorm的终端:
注意:此截图是在win10控制台直接输出的单词结果,多次运行之后,时间并没有相差很大,但是变量函数平均的情况下还是稍快。
我直接在IDE phpstorm的终端多次测试运行之后,发现相比在控制台的输出,运行时间两个减了将近一半,可能有优化输出。
4.调用类中的方法,如果是静态的方法,可以通过命名空间加方法命直接调用;如果是非静态的方法,可以先实例化一个对象,通过对象和方法命组成的数组作为参数被调用。
1 <?php
2 namespace Test;
3
4 class Test
5 {
6 static public function greet()
7 {
8 echo 'Hello the world!' ."\n";
9 }
10
11 public function say()
12 {
13 echo 'Good morning, sir!' ."\n";
14 }
15 }
16
17 call_user_func(__NAMESPACE__ .'\Test::greet');
18 call_user_func(array(__NAMESPACE__ .'\Test','greet'));
19
20 $test = new Test();
21 call_user_func(array($test,'say'));
5. 在引用别人的代码时,可能会有函数名称冲突的可能。如果是递归函数,可能就要修改内部的函数代码。使用call_user_func可以避免修改内部的代码。
function qwertyuiop($i=1) {
return($i==1?1:$i*call_user_func(__FUNCTION__,$i-1));
}
不过,个人觉得可以用变量函数代替使用call_user_func函数,可以吗?
PHP call_user_func的一些用法和注意点的更多相关文章
- php call_user_func和call_user_func_array
首先要看这个页面关于callable类型:http://www.php.net/manual/zh/language.types.callable.php 自 PHP 5.4 起可用 callable ...
- ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...
- call_user_func()的参数不能为引用传递 自定义替代方法
php手册 中关于 请注意,传入call_user_func()的参数不能为引用传递. 关于这个情况的解释,可自己搜索.我们可以自己定义一个函数解决这样的问题,实例如下: <?php ini_s ...
- Spark Rdd coalesce()方法和repartition()方法
在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- set和enum类型的用法和区别
mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值. 1 2 3 ...
- 【体系结构】动态调度算法:记分牌算法和tomasulo算法
记分牌和tomasulo算法 动态调度: 通过硬件在程序执行时重新安排代码的执行序列来减少竞争引起的流水线停顿时间 动态调度流水线具备以下功能: (1)允许按序取多条指令和发射多条指令----取指(I ...
- 《ES6基础教程》之 Call 方法和 Apply 方法
<script type="text/javascript"> // Call方法: // 语法:call(thisObj[,arg1,arg2,...,argN]) ...
- Javascript中数组方法和方法的扩展
最近一直在努力的恶补javascript中的各种知识,比如说闭包,作用域,继承,构造函数,变量,内置对象等概念.同时,也在学习着ES6的新知识.最近想给大家分享的就是数组实例方法的练习以及如何去扩展一 ...
随机推荐
- DevExpress的对话框XtraMessageBox的使用
场景 在Winform中一般弹出对话框使用的是MessageBox,而在 DevExpress中使用的是XtraMessageBox实现对话框. 效果 实现 首先新建确认按钮的调用方法: public ...
- eclipse查看.class文件
要使用jd-gui.exe反编译程序 步骤:window-preferences-general-editors-file associations, 如下图 上面的框选中,*.class witho ...
- Cabloy全栈JS框架微创新之一:不一样的“移动优先 PC适配”
前言 目前流行的前端UI组件库都支持移动设备优先的响应式布局特性.但基于Mobile和PC两个场景的不同用户体验,也往往会实现Mobile和PC两个版本. PC场景下的Web工程,如大量的后台前端管理 ...
- 005:CSS三大重点之三:定位
目录 1:定位模式和边偏移 2:定位模式 静态定位 相对定位:移动位置:脱标.占位置 绝对定位:脱标.占有位置. 拼爹型 子绝父相 固定定位:脱标.占有位置. 3:定位模式转换 3:z-index 前 ...
- [Spark] 01 - What is Spark
大数据 云计算概念 课程:Spark编程基础(Python版) 大数据4V特性 Volumn, Variety, Velocity, Value. 思维方式 通过数据发现问题,再解决问题. 速度更重要 ...
- html常见的块元素与内联(行内)元素用法说明(一)
html平时常见的块元素有:div, p, h1, h2, h3等,内联元素有:span, a, img等. 块元素的属性:无论内容是什么,都会独占一整行.主要用于页面布局. 内联元素的属性:只占自身 ...
- jenkins自动化部署项目1--下载安装启动(linux)
前面是在windows上搭建jenkins环境,最近有同事要我帮忙在linux上搭建一套,因此在此记录下过程. 因为jenkins.msi只能在windows上运行安装,因此在linux上安装jenk ...
- electron教程(二): http服务器, ws服务器, 进程管理
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...
- linux mint 17编译android 2.3.1错误记录
有转载这里的也有添加的. ################# Fix 1 ########################## Error: frameworks/base/include/utils ...
- 3D漫游的分类 3D Navigation Taxonomy
在2001年CHI发表的论文中1,Tan等人提出了一种对3D漫游的分类方法. 当时关于3D漫游(3D Navigation)的研究主要分为两种:一种是发掘有关漫游的认知原则,一种是开发一些具体的漫游技 ...