`
renzhen
  • 浏览: 250922 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Make code sweet.PHP特殊用法的一些总结(2)--PHP中的‘callback’回调

    博客分类:
  • PHP
阅读更多
本章总结一下PHP中‘callback’的一些实用用法。

1. 什么是callback?
    首先简单的介绍一下‘callback’,俗称‘回调’,是一种将一段可执行代码作为参数传递以供另一个函数调用的行为,回调在不同语言有不同的实现方式,几乎现在所有的主流语言都支持这个特性,我总结实现callback的主要方式有两种:
1.以C++、C#等静态语言为主的通过函数指针方式实现回调
2.以Ruby、JavaScript等动态语言为主的通过lambda表达式(也叫匿名函数)实现回调
关于‘callback’的详细定义可以参看维基百科:http://en.wikipedia.org/wiki/Callback_(computer_programming)

2.PHP中复杂的callback
    说起callback,很多人马上回想起PHP 5.3的lambda函数实现方式,这个的确是实现callback最方便最养眼的一种方法,如果你有机会使用PHP 5.3,一定要狠狠的使用它。但是对于那些无法使用PHP 5.3或者必须兼容低版本的应用而言,其实PHP中还是有很多其他的callback实现方式,下面我们一一道来。
  • PHP支持函数指针的方式实现,实现规则如下:
  • 如果传一个函数,将函数名以字符串形式传给参数
    如果传一个对象的方法,将一个数组传给参数,其中index=0的位置放对象,index=1的位置放方法名字符串
    如果传一个类的静态方法,将一个数组传给参数,其中index=0的位置放类名字符串,index=1的位置放方法名字符串

  • PHP支持使用函数create_function创建匿名函数
  • 这个是PHP 5.3以下版本创建匿名函数的唯一方式,原型如下:
    string create_function ( string $args , string $code )
    

      不过这个函数中把函数的参数列表和实现都放到了字符串中,在编辑器中无法语法高亮,很容易出错,而且还要对代码中的字符进行转义,这些复杂性限制了PHP中匿名函数的使用。

  • 就是前面提到的使用lambda函数(仅PHP 5.3及以上版本支持)
  •     随着闭包、lambda函数在语言中的流行,PHP也支持了lambda函数,语法仿照了javascript的匿名函数,不过和Ruby、JavaScript的闭包不同的是它不能访问闭包外层的变量,除非使用use将变量显示的引入。

        在PHP标准库中,如:array_map,usort等函数支持传递callback参数,你可以用上述任意方式作为参数。这样已经足够了,想实现一个函数,用户可以传递callback参数?当然没有问题,在参数列表中有一个callback参数,写着函数的实现,突然顿了顿,然后问出了如下问题:

    3.如何在函数中调用callback
        是啊,上面提到了如何构建callback参数,那如何在函数中执行这个参数呢?最容易想到的方式是直接使用字符串变量来执行函数,比如:
    $a='FunctionName';
    $a();
    

        这种方式直观,简单。不过这个方法不是对所有的callback形式的参数都有效,如果想兼容所有的callback参数,可以使用以下的函数:

    call_user_func和call_user_func_array
        这两个函数的用途是一样的,区别是call_user_func_array的函数传递给callback函数的参数必须用array排列,使用哪个凭个人喜好,我倾向使用call_user_func,字符少,参数更灵活。函数的原型如下:
    mixed call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )
    mixed call_user_func_array ( callback $function , array $param_arr )
    

    为了提高函数的容错性,我们需要在调用之前判断参数是否可以调用,这是可以使用如下函数:

    is_callable
    函数原型如下:
    bool is_callable ( callback $name [, bool $syntax_only= false [, string &$callable_name ]] )
    


      关于PHP中的callback就总结到这里。我的微博地址:http://weibo.com/jameren,欢迎大家关注,  。
    顺便做个广告:
    引用

    我最近使用了15G超大空间免费网络U盘—@酷盘,可在PC及手机上使用,无文件类型及大小限制,传输速度快,文件永不丢失,一起来体验吧!通过下面的邀请链接注册,你和我都将额外获得256MB的酷盘空间! http://t.cn/aNLZje
    0
    1
    分享到:
    评论

    相关推荐

      C++中回调函数(CallBack)的用法分析

      本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...

      glog-0.3.4

      add callback for OpenObjectFileContainingPcAndGetStartAddress add StrError and replace posix_strerror_r call fix VC build by adding GOOGLE_GLOG_DLL_DECL style fix for C++11 reduce dynamic allocation ...

      【WordPress插件】2022年最新版完整功能demo+插件v2.2.4.zip

      All in One Support Button + Callback Request. WhatsApp, Messenger, Telegram, LiveChat and ... 所有在一个支持按钮+回叫请求。 whatsapp,messenger,电报,livechat和..." ---------- 泰森云每天更新发布最新...

      C++中回调(CallBack)的使用思路

      ### C++中回调(CallBack)的使用思路 #### 一、回调的概念与作用 回调(Callback)是一种重要的编程模式,在C++中广泛应用于多种场景,尤其是处理事件驱动或异步操作时。简单来说,回调是一种将函数作为参数传递给...

      libX11生成libX11-xcb.so.1

      在Linux操作系统中,开发和运行图形用户界面(GUI)应用程序时,依赖库是不可或缺的部分。`libX11`是一个核心X Window System库,它提供了与X服务器进行通信的低级接口,允许应用程序处理键盘、鼠标输入以及显示窗口...

      jsonp相关jar包 cors-filter-1.7.jar和java-property-utils-1.9.jar

      JSONP的工作原理是,前端通过创建一个动态`<script>`标签,将请求的URL设置为其src属性,这个URL通常包含一个回调函数名作为参数。服务器接收到请求后,返回一个JavaScript脚本,其中包含数据并调用前端指定的回调...

      JNI 回调函数 Callback

      4. **实现回调**:在C/C++代码中,当需要触发回调时,使用`CallVoidMethod`等函数调用Java接口的相应方法。 **注意事项** 1. **线程安全**:Java和C/C++运行在不同的线程中,因此在多线程环境下,需要处理好同步...

      callback回调函数

      在计算机编程中,**回调函数**(Callback Function)是一种特殊的函数,它作为参数被传递给另一个函数,并在其内部被调用执行。这种机制允许程序员在不知道具体实现细节的情况下,定义一些自定义的行为或逻辑。 #### ...

      CallBack回调

      回调(Callback)是编程中一个重要的概念,尤其是在异步编程中。回调函数是一种将功能作为参数传递给另一个函数,以便在特定事件发生或任务完成后执行的编程技术。回调的使用可以解决程序执行顺序的问题,特别是在...

      openssh-5.8p2.tar.gz

      this code (for example web/mail server SSL certificates) should be replaced and old certificates revoked. Only SSL/TLS services are affected. Software that uses libcrypto alone is not affected. In ...

      CallBack_DEMO 回调

      回调(Callback)是一种在软件设计模式中常见的编程概念,它允许一个函数或对象在完成某个操作后通知另一个函数或对象。在本示例"CallBack_DEMO"中,我们可能正在探讨如何在Java或其他编程语言中实现回调机制。回调...

      halcon外触发get_framegrabber_callback注册回调函数方法

      本文将详细介绍如何在 C# 环境下利用 Halcon 的外触发机制来实现图像采集,并通过 `get_framegrabber_callback` 函数注册回调函数的方法。 #### 二、Halcon 外触发机制介绍 在实际应用中,很多时候我们需要根据...

      Qt使用回调函数方(callback)

      在提供的压缩包文件中,如`mainwindow.cpp`和`main.cpp`,可能包含了具体的信号槽连接示例,而`mainwindow.ui`则是Qt Designer生成的用户界面文件,`callback.pro`和`callback.pro.user`则是项目配置文件,它们共同...

      callback手把手教你写回调函数源代码

      回调函数在计算机编程中是一种非常重要的机制,尤其在异步编程和事件驱动的环境中发挥着核心作用。本文将深入探讨回调函数的概念、实现原理,并通过实际的源代码示例,教你如何在Linux环境下编写回调函数及制作库...

      VoIP Demo源码演示

      2. MainWndProc - Does some error checking, URI formatting if nessary, calls SessionWindowCallback 3. SessionWindowCallback - Initializes sesion window, more error checking, calls SessionTo 4. ...

      C-pointers-and-callback-function.zip_callback_function pointer_回

      总结起来,C语言中的指针、指针函数、函数指针和回调函数是构建复杂系统和高效算法的基础工具。理解并熟练运用这些概念,可以极大地提升C语言编程的技能水平。在实际编程中,它们经常结合使用,以实现灵活、高效和可...

      example-callback.php

      example_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback....

      How to make D.eval invoke the user-defined function callback

      在这个场景中,标题提到的“如何使D.eval调用用户定义的函数回调”是一个关于动态执行代码和回调机制的话题,通常出现在JavaScript或者某些支持类似功能的语言中。D.eval可能是指一个特定的库或框架中的函数,用于...

    Global site tag (gtag.js) - Google Analytics