PHP回调函数概念与用法实例分析


Posted in PHP onNovember 03, 2017

本文实例讲述了PHP回调函数概念与用法。分享给大家供大家参考,具体如下:

一、回调函数的概念

先看一下C语言里的回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

其他语言里的回调函数的概念与之相似,只不过各种语言里回调函数的实现机制不一样,通俗的来说,回调函数是一个我们定义的函数,但是不是我们直接来调用,而是通过另一个函数来调用,这个函数通过接收回调函数的名字和参数来实现对它的调用。

二、php中回调函数的实现

php提供了两个内置函数call_user_func()call_user_func_array()提供对回调函数的支持。这两个函数的区别是call_user_func_array是以数组的形式接收回调函数的参数的,看它的原型就知道了:mixed call_user_func_array ( callable $callback ,array$param_arr ),它只有两个参数。而call_user_func($callback,参数1,参数2,…)的参数个数根据回调函数的参数来确定的。

如何实现对脚本中全局函数、类中未使用$this的非静态方法、类中使用$this的非静态方法(需要传入对象)、类中静态方法的回调呢,下面是测试通过的代码。

<?php
//普通函数
function f1($arg1,$arg2)
{
  echo __FUNCTION__.'exec,the args is:'.$arg1.' '.$arg2;
  echo "<br/>";
}
//通过call_user_func调用函数f1
call_user_func('f1','han','wen');
  //通过call_user_func_array调用函数
call_user_func_array('f1',array('han','wen'));
class A
{
  public $name;
  function show($arg1)
  {
    echo 'the arg is:'.$arg1."<br/>";
    echo 'my name is:'.$this->name;
    echo "<br/>";
  }
  function show1($arg1,$arg2)
  {
    echo __METHOD__.' exec,the args is:'.$arg1.' '.$arg2."<br/>";
  }
  public static function show2($arg1,$arg2)
  {
    echo __METHOD__.' of class A exec, the args is:'.$arg1.' '.$arg2."<br/>";
  }
}
//调用类中非静态成员函数,该成员函数中有$this调用了对象中的成员
$a = new A;
$a->name = 'wen';
call_user_func_array(array($a,'show',),array('han!'));
//调用类中非静态成员函数,没有对象被创建,该成员函数中不能有$this
call_user_func_array(array('A','show1',),array('han!','wen'));
//调用类中静态成员函数
call_user_func_array(array('A','show2'),array('argument1','argument2'));

运行结果:

f1exec,the args is:han wen
f1exec,the args is:han wen
the arg is:han!
my name is:wen
A::show1 exec,the args is:han! wen
A::show2 of class A exec, the args is:argument1 argument2

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
php+mysql实现无限级分类
Nov 11 PHP
php经典算法集锦
Nov 14 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 PHP
PHP实现简易用户登录系统
Jul 10 PHP
PHP isset empty函数相关面试题及解析
Dec 11 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 #PHP
PHP空值检测函数与方法汇总
Nov 19 #PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 #PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 #PHP
swoole和websocket简单聊天室开发
Nov 18 #PHP
php单元测试phpunit入门实例教程
Nov 17 #PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 #PHP
You might like
php中使用临时表查询数据的一个例子
2013/02/03 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
JavaScript 特殊字符
2007/04/05 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
javascript连续赋值问题
2015/07/08 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python自动裁剪图像代码分享
2017/11/25 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
wxPython实现整点报时
2019/11/18 Python
python计算导数并绘图的实例
2020/02/29 Python
python入门教程之基本算术运算符
2020/11/13 Python
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
军训自我鉴定范文
2014/02/13 职场文书
文明生主要事迹
2014/05/25 职场文书
九九重阳节标语
2014/10/07 职场文书
学生上课说话检讨书
2014/10/25 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫