PHP 闭包详解及实例代码


Posted in PHP onSeptember 28, 2016

闭包和匿名函数在PHP5.3.0中引入的。

闭包是指:创建时封装周围状态的函数。即使闭包所处的环境不存在了,闭包中封装的状态依然存在。

理论上,闭包和匿名函数是不同的概念。但是PHP将其视作相同概念。

实际上,闭包和匿名函数是伪装成函数的对象。他们是Closure类的实例。

闭包和字符串、整数一样,是一等值类型。

创建闭包

<?php
$clousre = function ($name) {
return 'Hello ' . $name;
};
echo $closure('nesfo');

我们之所以能调用$closure变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()魔术方法。只要变量名后有(),PHP就会查找并调用__invoke()方法。通常会把PHP闭包当作函数的回调使用。array_map(), preg_replace_callback()方法都会用到回调函数,这是使用闭包的最佳时机!

举个例子:

<?php
$numbersPlusOne = array_map(function ($number) {
return $number + 1;
}, [1, 2, 3]);
print_r($numbersPlusOne);

得到结果:

[2, 3, 4]

在闭包出现之前,只能单独创建具名函数,然后使用名称引用那个函数。这么做,代码执行会稍微慢点,而且把回调的实现和使用场景隔离了。

<?php
function incrementNum ($number) {
return $number + 1;
}
$numbersPlusOne = array_map('incrementNum', [1, 2, 3]);
print_r($numbersPlusOne);

附加状态

匿名函数不止可以当回调使用,还可以为PHP附加并封装状态。

PHP中,必须手动调用闭包对象的bindTo()方法或者使用use关键字,才能把状态附加到PHP闭包上。

<?php
function enclosePerson ($name) {
return function ($doCommand) use ($name) {
return $name . ', ' . $doCommand;
}
}
$clay = enclosePerson('Clay');
echo $clay('get me sweet tea!');

得到结果:

"Clay, get me sweet tea!"

PHP闭包是对象,每个闭包实例都可以使用$this关键字获取闭包的内部状态。闭包对象的默认状态没什么用,只有__invoke()方法和bindTo方法而已。

我们可以使用bindTo()这个方法,将Closure对象的内部状态绑定到其它对象上。

bindTo()方法的第二个参数:其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员。

PHP框架经常使用bindTo()方法把路由URL映射到匿名回调函数上。这么做可以在这个匿名函数中使用$this关键字引用重要的应用对象。

使用bindTo()方法附加闭包状态

<?php
class App
{
protected $routes = [];
protected $responseStatus = '200 OK';
protected $responseContentType = 'text/html';
protected $responseBody = 'Hello world';
public function addRoute($routePath, $routeCallback){
$this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__);
}
public function dispatch($currentPath){
foreach($this->routes as $routePath => $callback){
if ($routePath === $currentPath) {
$callback();
}
}
header('HTTP/1.1' . $this->responseStatus);
header('Content-type: ' . $this->responseContentType);
header('Content-length' . mb_strlen($this->responseBody));
echo $this->responseBody;
}
}
<?php
$app = new App();
$app->addRoute('/user/nesfo', function () {
$this->responseContentType = 'application/json; charset=utf8';
$this->responseBody = '{"name": "nesfo"}';
});
$app->dispatch('/user/nesfo');

以上就是对PHP 闭包资料的资料整理,后续继续补充相关资料谢谢大家对本站的支持!

PHP 相关文章推荐
解决PHP在DOS命令行下却无法链接MySQL的技术笔记
Dec 29 PHP
PHP的变量类型和作用域详解
Mar 12 PHP
PHP防盗链代码实例
Aug 27 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 PHP
两个php日期控制类实例
Dec 09 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 PHP
php解析非标准json、非规范json的方式实例
May 10 PHP
php类的自动加载操作实例详解
Sep 28 #PHP
PHP对象克隆clone用法示例
Sep 28 #PHP
PHP简单遍历对象示例
Sep 28 #PHP
PHP标准类(stdclass)用法示例
Sep 28 #PHP
PHP类型约束用法示例
Sep 28 #PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 #PHP
PHP序列化操作方法分析
Sep 28 #PHP
You might like
由php if 想到的些问题
2008/03/22 PHP
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
php把数组值转换成键的方法
2015/07/13 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
wxpython绘制圆角窗体
2019/11/18 Python
python写一个随机点名软件的实例
2019/11/28 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
创业计划书之o2o水果店
2019/08/30 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python