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 相关文章推荐
PHP初学者头疼问题总结
Oct 09 PHP
codeigniter框架批量插入数据
Jan 09 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php支付宝接口用法分析
Jan 04 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
php实现转换html格式为文本格式的方法
May 16 PHP
PHP基本语法实例总结
Sep 09 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 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
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
MooTools 1.2介绍
2009/09/14 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
python中Flask框架简单入门实例
2015/03/21 Python
python实现在windows下操作word的方法
2015/04/28 Python
python实现bucket排序算法实例分析
2015/05/04 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python线程指南详细介绍
2017/01/05 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
django初始化数据库的实例
2018/05/27 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
车间调度岗位职责
2013/11/30 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
志愿者宣传口号
2014/06/17 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
初中班主任心得体会
2016/01/07 职场文书
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL