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获取文件后缀名的三个函数
Oct 15 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
php代码架构的八点注意事项
Jan 25 PHP
深入剖析PHP中printf()函数格式化使用
May 23 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
PHP控制循环操作的时间
Apr 01 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加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php递归列出所有文件和目录的代码
2008/09/10 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
nginx 设置多个站跨域
2021/03/09 Servers
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
js实现双人五子棋小游戏
2020/05/28 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
python二分法实现实例
2013/11/21 Python
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Python 中如何写注释
2020/08/28 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
方正Java笔试题
2014/07/03 面试题
境外导游求职信
2014/02/27 职场文书
爱与责任演讲稿
2014/05/20 职场文书
工作证明格式及范本
2014/09/12 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
入队仪式主持词
2015/07/04 职场文书
python状态机transitions库详解
2021/06/02 Python
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS