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 相关文章推荐
source.php查看源文件
Dec 09 PHP
php读取msn上的用户信息类
Dec 05 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
php中引用符号(&amp;)的使用详解
Nov 13 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
php去除数组中重复数据
Nov 18 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
微信公众号开发之文本消息自动回复php代码
Aug 08 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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
回帖脱衣服的图片实现代码
2014/02/15 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
PHP中的self关键字详解
2019/06/23 PHP
php框架知识点的整理和补充
2021/03/01 PHP
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
Python实现的归并排序算法示例
2017/11/21 Python
Python使用贪婪算法解决问题
2019/10/22 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
音乐系毕业生自荐信
2013/10/27 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
教师评优事迹材料
2014/01/10 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
计生工作先进事迹
2014/08/15 职场文书
承诺书模板
2014/08/30 职场文书
比赛主持人开场白
2015/05/29 职场文书
演讲开场白和结束语
2015/05/29 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js