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 相关文章推荐
基于mysql的论坛(6)
Oct 09 PHP
PHP去除数组中重复的元素并按键名排序函数
Aug 18 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
PHP 第二节 数据类型之转换
Apr 28 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
ThinkPHP连接Oracle数据库
Apr 22 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php curl 上传文件代码实例
2015/04/27 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
python如何实现内容写在图片上
2018/03/23 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
办公室助理岗位职责
2013/12/25 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
Golang 并发编程 SingleFlight模式
2022/04/26 Golang