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往windows中添加用户
Dec 06 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
php中++i 与 i++ 的区别
Aug 08 PHP
PHP获取当前页面完整URL的实现代码
Jun 10 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 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代码把全角数字转为半角数字
2007/12/10 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
Django  ORM 练习题及答案
2019/07/19 Python
简单介绍python封装的基本知识
2019/08/10 Python
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
美国帽子俱乐部商店:Hat Club
2019/07/05 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
25道Java面试题集合
2013/05/21 面试题
学生评语大全
2014/04/18 职场文书
活动总结格式范文
2014/04/26 职场文书
党员群众路线承诺书
2014/05/20 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
2014年人大工作总结
2014/12/10 职场文书
工作时间证明
2015/06/15 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
Python实现学生管理系统(面向对象版)
2021/06/24 Python
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫