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 相关文章推荐
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
php 生成WML页面方法详解
Aug 09 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
PHP远程采集图片详细教程
Jul 01 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
php截取html字符串及自动补全html标签的方法
Jan 15 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
php操作xml并将其插入数据库的实现方法
Sep 08 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 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中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
技校毕业生的自我评价
2013/12/27 职场文书
员工安全生产责任书
2014/07/22 职场文书
先进班集体事迹材料
2014/12/25 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python