热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php什么时候用回调函数(2023年最新分享)

导读:本篇文章编程笔记来给大家介绍有关php什么时候用回调函数的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、php框

导读:本篇文章编程笔记来给大家介绍有关php什么时候用回调函数的相关内容,希望对大家有所帮助,一起来看看吧。

本文目录一览:


  • 1、php 框架 怎么使用回调函数


  • 2、回调函数什么概念,php中如何使用自定义的回调函数


  • 3、php中的回调函数

php 框架 怎么使用回调函数

前言

最近在开发一个PHP系统,为了提高系统的扩展性,我想在系统中加入类似Javascript的事件处理机制,例如:我想在一篇新闻被添加以后,我想记录一下日志,用类似Javascript的代码,应该是这样写的:

function fnCallBack( $news )

{

//将$news的信息记录到日志中

writeLog( $news-getTitle().' has been added successfully!');

}

$newsEventManager-addEventListener( 'add' , fnCallBack );

其中,fnCallBack函数是回调函数,addEventListener表示监听newsEventManager的add事件。当一篇news被add以后,系统就会调用fnCallBack函数,从而完成writeLog的动作。

但是,PHP中的函数传递方法和Javascript有很大的不同。在Javascript中,函数也是对象,它可以很方便的当作参数传递,但是PHP不行。

$newsEventManager-addEventListener( 'add' , fnCallBack );

上面这行代码中的fnCallBack,看上去好像是那个函数的句柄,但实质上它是一个字符串,并不是我们所要的函数。

为了实现我们的事件模型,有必要研究一下PHP的回调函数的实现方法。

全局函数的回调

这里的全局函数的意思,是直接使用function定义的函数,它不包含在任何对象或类之中。请看下面的例子

示例代码

function fnCallBack( $msg1 , $msg2 )

{

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

call_user_func_array( $fnName , $params );

代码说明:

这里使用了PHP内置的函数call_user_func_array来进行调用。call_user_func_array有两个参数,第1个参数是一个字符串,表示要调用的函数名,第2个参数是一个数组,表示参数列表,按照顺序依次会传递给要调用的函数。

效果如下:

类的静态方法的回调

如果我们要回调的方法,是一个类的静态方法,那怎么办呢?我们依然可以利用PHP内置的call_user_func_array方法来进行调用,请看示例:

示例代码:

class MyClass

{

public static function fnCallBack( $msg1 , $msg2 )

{

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$className = 'MyClass';

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

call_user_func_array( array( $className , $fnName ) , $params );

代码说明:

这段代码和第1种方法的代码很相似,我们将类名(MyClass)也作为call_user_func_array的第1个参数传递进去,就可以实现类的静态方法的回调了。注意,这时call_user_func_array的第1个参数是一个数组了,数组的第1个元素是类名,第二个元素是要调用的函数名

运行结果:

(其实和第1种方法的结果是一样的 ^_^ )

继续研究

如果我用这种方法调用一个类的非静态方法(也就是把static去掉),会出现什么结果呢?请看下面代码

class MyClass

{

public function fnCallBack( $msg1 , $msg2 )

{

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$className = 'MyClass';

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

call_user_func_array( array( $className , $fnName ) , $params );

运行结果

和前面的结果还是一样的。。。

现在我为这个类添加一点属性,并在方法中引用

class MyClass

{

private $name = 'abc';

public function fnCallBack( $msg1 , $msg2 )

{

echo 'object name:'.$this-name;

echo "br /\n";

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$className = 'MyClass';

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

call_user_func_array( array( $className , $fnName ) , $params );

运行结果

出现解析错误,提示$this没有在对象环境下出现,说明这个方法不能用类来调用,而是要用对象来调用。那我们就修改一下代码,创建一个对象:

class MyClass

{

public function fnCallBack( $msg1 , $msg2 )

{

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$myobj = new MyClass();

$className = 'myobj';

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

call_user_func_array( array( $className , $fnName ) , $params );

运行结果:

提示call_user_func_array的第1个参数非法,也就是说,调用失败。看来我们不能用call_user_func_array方法来回调一个对象的方法了,那么如何实现对象方法的回调的?

对象的方法的回调

我先用最原始的字符串形式的调用方法尝试了一下,如下所示:

class MyClass

{

private $name = 'abc';

public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )

{

echo 'object name:'.$this-name;

echo "br /\n";

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$myobj = new MyClass();

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

$myobj-$fnName();

成功了,输出结果

调用是成功了,不过如何把参数params传给这个方法呢,如果把params直接传进去,那么它会作为1个参数,怎么把params拆开来传进去呢?

查了下PHP手册,找到了create_function函数,这个方法可以用字符串来创建一个匿名函数,好,有思路了,可以创建一个匿名的函数,在这个匿名函数中,调用我们的回调函数,并把参数传进去。

我先手动创建一个匿名函数anonymous,在这个函数中,用前面试出来的方法调用回调函数,如下所示:

class MyClass

{

private $name = 'abc';

public function fnCallBack( $msg1 = 'default msg1' , $msg2 = 'default msg2' )

{

echo 'object name:'.$this-name;

echo "br /\n";

echo 'msg1:'.$msg1;

echo "br /\n";

echo 'msg2:'.$msg2;

}

}

$myobj = new MyClass();

$fnName = "fnCallBack";

$params = array( 'hello' , 'world' );

function anonymous()

{

global $myobj;

global $fnName;

global $params;

$myobj-$fnName( $params[0] , $params[1] );

}

anonymous();

成功了,可以看到,对象的属性name也输出来了

然后,我用create_function来创建这个匿名函数,同时,代码中的params[0],params[1]应该是动态生成的,代码如下:

$strParams = '';

$strCode = 'global $myobj;global $fnName;global $params;$myobj-$fnName(';

for ( $i = 0 ; $i count( $params ) ; $i ++ )

{

$strParams .= ( '$params['.$i.']' );

if ( $i != count( $params )-1 )

{

$strParams .= ',';

}

}

$strCode = $strCode.$strParams.");";

$anOnymous= create_function( '' , $strCode);

$anonymous();

这段代码可以定义一个匿名函数,并保存在$anonymous变量中,最后调用这个$anonymous,实现了方法的回调,如图

PHP事件模型(观察者模式)的实现思路

至此,PHP中的3种常见的函数类型(全局函数,类静态函数,对象的方法)都可以回调了,可以实现文章一开始说的事件模型了 :)

事件模型模仿Firefox的Javascript实现,有3个方法,分别是

addEventListener:注册一个事件上的响应回调函数

removeEventListener:删除一个事件上的响应回调函数

fire:触发一个事件,也就是循环调用所有响应这个事件的回调函数

不过,由于第2、第3种方法需要传递上下文(也就是类名和对象名),所以addEventListener和removeEventListener应该有3个参数,我是这样设计的:

function addEventListener( $evtName , $handler , $scope = null )

第1个参数表示事件名,字符串类型

第2个参数表示回调函数名,字符串类型

第3个参数$scope是上下文环境,一共有3种类型,null表示传入的handler函数是一个全局函数,字符串类型表示传入的handler函数是scope类的静态函数,对象类型表示传入的scope是一个对象,handler函数是对象的一个方法。

function fire( $evtName , $params = null )

这个方法内,会读取出所有响应evtName的handler,然后判断它对应的scope,如果是null,则用本文第1种方法回调,如果是字符串,则用本文第2种方法回调,如果是对象,则用本文第3种方法回调。这样,一个PHP的事件模型就可以实现了,而且可以将回调函数放在某个对象中。

回调函数什么概念,php中如何使用自定义的回调函数

用户自定义函数也称自定义函数,它们不是PHP提供的,是由程序员创建的.由于自己创建了这样的函数,所以就可以完全控制这些函数.因此可以让一个函数完全按照自己希望的方式运行.1,申明函数在PHP中,定义函数的方法同其他编程语言几乎一样.下面是PHP申明函数的语法结构:Function function_name($argument1,$argument2,$argument3,......$argumentn){//函数代码codeReturn 返回值;}以上语法结构中,关键字的含义如下.(1)function:用于申明用户自定义函数的关键字.(2)function_name:要创建的函数名称.该名称将在以后被调用时使用.函数名应该唯一,因为PHP不支持重载.在命名函数的时候,需要遵循和变量命名相同的原则.但是函数名不能以$开头,而变量可以.(3)argument:要传递给函数的值.函数可以有多个参数,它们之间用逗号.但是参数项是可选的,可以在调用函数的时候不传递任何参数.(4)code:是在函数被调用的时候执行的一段代码.如果有两条或者多条语句,则代码必须用大括号"{}"括起来.但是,如果只有一条代码,则不需要大括号.(5)Return:将调用的代码需要的值返回.任何类型都可以返回,包括列表和对象.这导致函数立即结束它的运行,并且将控制权传递回它被调用的行.2,无参数函数代码func_1.php?php

require 'a.php';

echo "我不会被执行!";?3,有参数函数PHP支持按值传递参数(默认),通过引用传递和默认参数值.可变长度参数列表仅在PHP4和后继版本中被支持.(1)值传递参数.按值进行参数传递是PHP的默认传递方式.使用这个方法,必须在主程序调用时传递一个值(参数).代码sum.php?php

function sum ($a,$b)

{

Echo $a+$b;

}

sum(100,20); //开始调用该函数

?

(2)引用参数.在按照值传递的时候,只有参数的副本传递给被调用的函数.但是在被调用函数内部对这些值的任何修改,都不会影响调用函数中的原始值.引用传递其实也就是地址传递,将一个变量的地址作为参数传递.代码valuechange.php ?php

$myNum=100;

function Valuechange ($number)

{

$number=$number+1;

Echo $number . "br";

}

Valuechange($myNum);

Echo $myNum;

?

(3)默认值参数.使用默认的参数值传递方法,函数必须在调用的时候有一个参数.如果没有使用的值,就把默认值传递给函数参数.默认值必须是常量表达式,不是变量,类成员或者函数调用.提示:当使用默认参数时,任何默认参数必须放在非默认参数的右侧;否则,可能函数不会按照预期的情况工作.代码func_default.php?php

$myNum=100;

function Valuechange ($number)

{

$number=$number+1;

Echo $number . "br";

}

Valuechange($myNum);

Echo $myNum;

?

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,…)的参数个数根据回调函数的参数来确定的。

结语:以上就是编程笔记为大家整理的关于php什么时候用回调函数的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于php什么时候用回调函数的相关内容别忘了在本站进行查找喔。


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 在最近的学习过程中,我对Vue.js中的Prop属性有了更深入的理解,并认为这一知识点至关重要,因此在此记录一些心得体会。Prop属性用于在组件之间传递数据。由于每个组件实例的作用域都是独立的,无法直接引用父组件的数据。通过使用Prop,可以将数据从父组件安全地传递到子组件,确保数据的隔离性和可维护性。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
author-avatar
岁月静好198838
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有