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 相关文章推荐
我的论坛源代码(四)
Oct 09 PHP
自动分页的不完整解决方案
Jan 12 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php+javascript的日历控件
Nov 19 PHP
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
Feb 09 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
php日期转时间戳,指定日期转换成时间戳
Jul 17 PHP
Yii中CGridView实现批量删除的方法
Dec 28 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 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中与数组相关的函数
2007/03/22 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
node.js基础知识小结
2018/02/26 Javascript
js实现鼠标单击Tab表单切换效果
2018/05/16 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
JavaScript实现模态对话框实例
2020/01/13 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
全网小程序接口请求封装实例代码
2020/11/06 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
对python中的装包与解包实例详解
2019/08/24 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
英国领先的酒类网上商城:TheDrinkShop
2017/03/16 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
公证委托书模板
2014/04/03 职场文书
计算机专业应届生求职信
2014/04/06 职场文书
求职自荐信的格式
2014/04/07 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
学期个人工作总结
2015/02/13 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
开场白怎么写
2015/06/01 职场文书
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL