本章总结一下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
分享到:
相关推荐
本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
cpp-8.3.1-4.5.ky10.aarch64.rpm
All in One Support Button + Callback Request. WhatsApp, Messenger, Telegram, LiveChat and ... 所有在一个支持按钮+回叫请求。 whatsapp,messenger,电报,livechat和..." ---------- 泰森云每天更新发布最新...
An asynchronous, callback-based Http client for Android built on top of Apache's HttpClient libraries. Changelog See what is new in version 1.4.9 released on 19th September 2015 ...
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 ...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
2. MainWndProc - Does some error checking, URI formatting if nessary, calls SessionWindowCallback 3. SessionWindowCallback - Initializes sesion window, more error checking, calls SessionTo 4. ...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
example_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback.phpexample_callback....
2 License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3 About Callbacks . . . . . . . . . . . . . . . . . ...
2.商家测试可以先用易宝支付的测试商家测试成功再在merchantProperties.php文件中修改成自己的商家ID和密钥信息 $p1_MerId = "10001126856"; $merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37...
# 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,...
* Description: This is the Sample code to show the usage of EDSDK. * * * * * ******************************************************************************* * * * Written and developed by Camera ...
CallBack回调函数
Qt使用回调函数方(callback)