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 相关文章推荐
PHP4 与 MySQL 交互使用
Oct 09 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
thinkphp实现多语言功能(语言包)
Mar 04 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
微信支付PHP SDK ―― 公众号支付代码详解
Sep 13 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
laravel model 两表联查示例
Oct 24 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上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
destoon复制新模块的方法
2014/06/21 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
js 对象使用的小技巧实例分析
2019/11/08 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python实现数据库编程方法详解
2015/06/09 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
Django 反向生成url实例详解
2019/07/30 Python
Python内置异常类型全面汇总
2020/05/28 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
厂办主管岗位职责范本
2014/02/28 职场文书
教师节促销方案
2014/03/22 职场文书
防灾减灾标语
2014/10/07 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2014年质检工作总结
2014/11/26 职场文书
初中团支书竞选稿
2015/11/21 职场文书