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 20 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
php可生成缩略图的文件上传类实例
Dec 17 PHP
php从给定url获取文件扩展名的方法
Mar 14 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
如何解决php-fpm启动不了问题
Nov 17 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 分页类实现代码
2009/12/03 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
Python socket编程实例详解
2015/05/27 Python
python实现将内容分行输出
2015/11/05 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
python中abs&amp;map&amp;reduce简介
2018/02/20 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python日志logging模块使用方法分析
2019/05/23 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
开业庆典邀请函
2014/01/08 职场文书
英语商务邀请函范文
2014/01/16 职场文书
大学自主招生推荐信
2014/05/10 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书