php 5.3新增的闭包语法介绍function() use() {}
- <?php
- /**
- * author: selfimpr
- * mail: lgg860911@yahoo.com.cn
- * blog: http://blog.csdn.net/lgg201
- * 下面提到的代码在PHP5.3以上版本运行通过.
- */
- function callback($callback) {
- $callback();
- }
- //输出: This is a anonymous function.<br />/n
- //这里是直接定义一个匿名函数进行传递, 在以往的版本中, 这是不可用的.
- //现在, 这种语法非常舒服, 和javascript语法基本一致, 之所以说基本呢, 需要继续向下看
- //结论: 一个舒服的语法必然会受欢迎的.
- callback(function() {
- print "This is a anonymous function.<br />/n";
- });
- //输出: This is a closure use string value, msg is: Hello, everyone.<br />/n
- //这里首先定义了一个闭包, 这次户口本上有名字了...
- //use, 一个新鲜的家伙...
- //众所周知, 闭包: 内部函数使用了外部函数中定义的变量.
- //在PHP新开放的闭包语法中, 我们就是用use来使用闭包外部定义的变量的.
- //这里我们使用了外部变量$msg, 定义完之后, 又对其值进行了改变, 闭包被执行后输出的是原始值
- //结论: 以传值方式传递的基础类型参数, 闭包use的值在闭包创建是就确定了.
- $msg = "Hello, everyone";
- $callback = function () use ($msg) {
- print "This is a closure use string value, msg is: $msg. <br />/n";
- };
- $msg = "Hello, everybody";
- callback($callback);
- //输出: This is a closure use string value lazy bind, msg is: Hello, everybody.<br />/n
- //换一种引用方式, 我们使用引用的方式来use
- //可以发现这次输出是闭包定义后的值...
- //这个其实不难理解, 我们以引用方式use, 那闭包use的是$msg这个变量的地址
- //当后面对$msg这个地址上的值进行了改变之后, 闭包内再输出这个地址的值时, 自然改变了.
- $msg = "Hello, everyone";
- $callback = function () use (&$msg) {
- print "This is a closure use string value lazy bind, msg is: $msg. <br />/n";
- };
- $msg = "Hello, everybody";
- callback($callback);
- //输出: This is a closure use object, msg is: Hello, everyone.<br />/n
- //闭包中输出的是之前被拷贝的值为Hello, everyone的对象, 后面是对$obj这个名字的一个重新赋值.
- //可以这样考虑
- //1. obj是对象Hello, everyone的名字
- //2. 对象Hello, everyone被闭包use, 闭包产生了一个对Hello, everyone对象的引用
- //3. obj被修改为Hello, everybody这个对象的名字
- //4. 注意, 是名字obj代表的实体变了, 而不是Hello, everyone对象, 那自然闭包的输出还是前面的Hello, everyone
- $obj = (object) "Hello, everyone";
- $callback = function () use ($obj) {
- print "This is a closure use object, msg is: {$obj->scalar}. <br />/n";
- };
- $obj = (object) "Hello, everybody";
- callback($callback);
- //输出: This is a closure use object, msg is: Hello, everybody.<br />/n
- //还是按照上面的步骤, 按部就班的来吧:
- //1. obj名字指向Hello, everyone对象
- //2. 闭包产生一个引用指向Hello, everyone对象
- //3. 修改obj名字指向的对象(即Hello, everyone对象)的scalar值
- //4. 执行闭包, 输出的自然是Hello, everybody, 因为其实只有一个真正的对象
- $obj = (object) "Hello, everyone";
- $callback = function () use ($obj) {
- print "This is a closure use object, msg is: {$obj->scalar}. <br />/n";
- };
- $obj->scalar = "Hello, everybody";
- callback($callback);
- //输出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />/n
- //闭包引用的是什么呢? &$obj, 闭包产生的引用指向$obj这个名字所指向的地址.
- //因此, 无论obj怎么变化, 都是逃不脱的....
- //所以, 输出的就是改变后的值
- $obj = (object) "Hello, everyone";
- $callback = function () use (&$obj) {
- print "This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />/n";
- };
- $obj = (object) "Hello, everybody";
- callback($callback);
- /**
- * 一个利用闭包的计数器产生器
- * 这里其实借鉴的是python中介绍闭包时的例子...
- * 我们可以这样考虑:
- * 1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1.
- * 2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用.
- * 3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用,
- * 它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的
- * 变量.
- * 4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的.
- * 5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器.
- * 结论: 此函数可以用来生成相互独立的计数器.
- */
- function counter() {
- $counter = 1;
- return function() use(&$counter) {return $counter ++;};
- }
- $counter1 = counter();
- $counter2 = counter();
- echo "counter1: " . $counter1() . "<br />/n";
- echo "counter1: " . $counter1() . "<br />/n";
- echo "counter1: " . $counter1() . "<br />/n";
- echo "counter1: " . $counter1() . "<br />/n";
- echo "counter2: " . $counter2() . "<br />/n";
- echo "counter2: " . $counter2() . "<br />/n";
- echo "counter2: " . $counter2() . "<br />/n";
- echo "counter2: " . $counter2() . "<br />/n";
- ?>
php 5.3新增的闭包语法介绍function() use() {}相关推荐
- Swift翻译之-Swift语法入门 Swift语法介绍
目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...
- Python闭包基本介绍与作用
目录 1.闭包基本介绍 1.1 外函数的返回值是内函数的引用 1.2 外函数把临时变量绑定给内函数 1.3 闭包中内函数修改外函数局部变量 2.闭包的作用 1.闭包基本介绍 "闭包" ...
- Linux中常用的tar解压打包命令语法介绍
常用的tar解压打包命令语法介绍 1.命令格式 2.命令功能 3.命令参数 4.常见解压/压缩命令 5.使用实例 1.命令格式 tar[必要参数][选择参数][文件] 2.命令功能 用来压缩和解压文件 ...
- swift语言特性,swift语法介绍,swift使用技巧
Swift语言特性.Swift语法介绍.Swift使用技巧 Swift是一种由苹果公司开发的编程语言,于2014年首次发布.它是一种现代.快速.安全的编程语言,用于iOS.macOS.watchOS和 ...
- 闭包的介绍、构成条件、作用及示例代码
1. 闭包的介绍 我们学过了函数,我们知道当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一些列的操作,比如: 每次在这个变量的基础上和其它数 ...
- swift1.2语言函数和闭包函数介绍
swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...
- Markdown 语法介绍
Markdown 语法介绍 from:https://coding.net/help/doc/project/markdown.html 文章内容 1 Markdown 语法介绍 1.1 标题 1.2 ...
- sql和mysql语法_SQL 与MySQL-基本语法介绍
MySQL-基本语法介绍 简单说:msyql 就是一个仓库, sql就是如何从仓库取(查询.更改)东西,它们是一个组合,在一起亲密合作,缺一不合: MySQL 基本语法介绍 1. 什么是SQL SQL ...
- php语法介绍,PHP语法介绍
php7新特性是什么 php7新特性是什么?在PHP7中由于修改了底层引擎大部分代码,以及通过各种方式提高PHP的性能,所以在PHP7中也增加了一些新的语法,这些语法的使用也能对提高性能有帮助.下面给 ...
最新文章
- 自动备份脚本 mysql svn
- C#调用淘宝API流程整理
- 计算特征数据matlab代码,科学网—MATLAB特征提取代码 - 蒋样明的博文
- Github标星2w+,热榜第一,如何用Python实现所有算法
- linux 切换用户_Linux 用户态切换到内核态的 3 种方式
- 计算机视觉与深度学习 | 粒子群算法与遗传算法(GA)及与蚁群算法(ACO)比较
- 【项目介绍】协程——C语言实现的用户态非抢占式轻量级线程
- servle 3.0 新特性之一 对上传表单的支持
- Runtime的应用
- grafana + influxdb + telegraf , 构建性能监控平台
- 定期定量采购_采购的四种方法
- 【转】恢复默认vs2005
- r语言数据变量分段_R语言之数据汇总
- 基于VS+Opencv2.4.10的微信跳一跳辅助工具
- 搜索引擎优化与信息检索有什么关联
- docker创建容器共享目录
- SCT1270,SCT1271,12.6V, 7A, 全集成高效升压变换器
- STM32学习之DS18B20数字温度传感器
- 卸载office时显示的是安装包的语言不支持程序,而且也卸载不了..
- Shell 练习题(一)
热门文章
- NOI 08 石头剪刀布
- 最小生成树,回忆复习篇。
- 可适配平板、手机的Web开发方式
- 网络编程——第一部分
- DevExpress GridControl 导出为Excel
- 编写Android.mk中的LOCAL_SRC_FILES,使其自动查找源文件,不需要手动添加
- 嵌套地狱_解决嵌套业务逻辑_使用Js的对象_避免数组嵌套---SpringCloud Alibaba_若依微服务框架改造_ElementUI---工作笔记016
- java零碎要点---struts2中redirect和redirectAction的区别
- 2014年0417的工作计划
- 《How to Generate a Good Word Embedding?》导读(转)