[php] view plain copy
  1. <?php
  2. /**
  3. * author: selfimpr
  4. * mail: lgg860911@yahoo.com.cn
  5. * blog: http://blog.csdn.net/lgg201
  6. * 下面提到的代码在PHP5.3以上版本运行通过.
  7. */
  8. function callback($callback) {
  9. $callback();
  10. }
  11. //输出: This is a anonymous function.<br />/n
  12. //这里是直接定义一个匿名函数进行传递, 在以往的版本中, 这是不可用的.
  13. //现在, 这种语法非常舒服, 和javascript语法基本一致, 之所以说基本呢, 需要继续向下看
  14. //结论: 一个舒服的语法必然会受欢迎的.
  15. callback(function() {
  16. print "This is a anonymous function.<br />/n";
  17. });
  18. //输出: This is a closure use string value, msg is: Hello, everyone.<br />/n
  19. //这里首先定义了一个闭包, 这次户口本上有名字了...
  20. //use, 一个新鲜的家伙...
  21. //众所周知, 闭包: 内部函数使用了外部函数中定义的变量.
  22. //在PHP新开放的闭包语法中, 我们就是用use来使用闭包外部定义的变量的.
  23. //这里我们使用了外部变量$msg, 定义完之后, 又对其值进行了改变, 闭包被执行后输出的是原始值
  24. //结论: 以传值方式传递的基础类型参数, 闭包use的值在闭包创建是就确定了.
  25. $msg = "Hello, everyone";
  26. $callback = function () use ($msg) {
  27. print "This is a closure use string value, msg is: $msg. <br />/n";
  28. };
  29. $msg = "Hello, everybody";
  30. callback($callback);
  31. //输出: This is a closure use string value lazy bind, msg is: Hello, everybody.<br />/n
  32. //换一种引用方式, 我们使用引用的方式来use
  33. //可以发现这次输出是闭包定义后的值...
  34. //这个其实不难理解, 我们以引用方式use, 那闭包use的是$msg这个变量的地址
  35. //当后面对$msg这个地址上的值进行了改变之后, 闭包内再输出这个地址的值时, 自然改变了.
  36. $msg = "Hello, everyone";
  37. $callback = function () use (&$msg) {
  38. print "This is a closure use string value lazy bind, msg is: $msg. <br />/n";
  39. };
  40. $msg = "Hello, everybody";
  41. callback($callback);
  42. //输出: This is a closure use object, msg is: Hello, everyone.<br />/n
  43. //闭包中输出的是之前被拷贝的值为Hello, everyone的对象, 后面是对$obj这个名字的一个重新赋值.
  44. //可以这样考虑
  45. //1. obj是对象Hello, everyone的名字
  46. //2. 对象Hello, everyone被闭包use, 闭包产生了一个对Hello, everyone对象的引用
  47. //3. obj被修改为Hello, everybody这个对象的名字
  48. //4. 注意, 是名字obj代表的实体变了, 而不是Hello, everyone对象, 那自然闭包的输出还是前面的Hello, everyone
  49. $obj = (object) "Hello, everyone";
  50. $callback = function () use ($obj) {
  51. print "This is a closure use object, msg is: {$obj->scalar}. <br />/n";
  52. };
  53. $obj = (object) "Hello, everybody";
  54. callback($callback);
  55. //输出: This is a closure use object, msg is: Hello, everybody.<br />/n
  56. //还是按照上面的步骤, 按部就班的来吧:
  57. //1. obj名字指向Hello, everyone对象
  58. //2. 闭包产生一个引用指向Hello, everyone对象
  59. //3. 修改obj名字指向的对象(即Hello, everyone对象)的scalar值
  60. //4. 执行闭包, 输出的自然是Hello, everybody, 因为其实只有一个真正的对象
  61. $obj = (object) "Hello, everyone";
  62. $callback = function () use ($obj) {
  63. print "This is a closure use object, msg is: {$obj->scalar}. <br />/n";
  64. };
  65. $obj->scalar = "Hello, everybody";
  66. callback($callback);
  67. //输出: This is a closure use object lazy bind, msg is: Hello, everybody.<br />/n
  68. //闭包引用的是什么呢? &$obj, 闭包产生的引用指向$obj这个名字所指向的地址.
  69. //因此, 无论obj怎么变化, 都是逃不脱的....
  70. //所以, 输出的就是改变后的值
  71. $obj = (object) "Hello, everyone";
  72. $callback = function () use (&$obj) {
  73. print "This is a closure use object lazy bind, msg is: {$obj->scalar}. <br />/n";
  74. };
  75. $obj = (object) "Hello, everybody";
  76. callback($callback);
  77. /**
  78. * 一个利用闭包的计数器产生器
  79. * 这里其实借鉴的是python中介绍闭包时的例子...
  80. * 我们可以这样考虑:
  81. *      1. counter函数每次调用, 创建一个局部变量$counter, 初始化为1.
  82. *      2. 然后创建一个闭包, 闭包产生了对局部变量$counter的引用.
  83. *      3. 函数counter返回创建的闭包, 并销毁局部变量, 但此时有闭包对$counter的引用,
  84. *          它并不会被回收, 因此, 我们可以这样理解, 被函数counter返回的闭包, 携带了一个游离态的
  85. *          变量.
  86. *      4. 由于每次调用counter都会创建独立的$counter和闭包, 因此返回的闭包相互之间是独立的.
  87. *      5. 执行被返回的闭包, 对其携带的游离态变量自增并返回, 得到的就是一个计数器.
  88. * 结论: 此函数可以用来生成相互独立的计数器.
  89. */
  90. function counter() {
  91. $counter = 1;
  92. return function() use(&$counter) {return $counter ++;};
  93. }
  94. $counter1 = counter();
  95. $counter2 = counter();
  96. echo "counter1: " . $counter1() . "<br />/n";
  97. echo "counter1: " . $counter1() . "<br />/n";
  98. echo "counter1: " . $counter1() . "<br />/n";
  99. echo "counter1: " . $counter1() . "<br />/n";
  100. echo "counter2: " . $counter2() . "<br />/n";
  101. echo "counter2: " . $counter2() . "<br />/n";
  102. echo "counter2: " . $counter2() . "<br />/n";
  103. echo "counter2: " . $counter2() . "<br />/n";
  104. ?>

php 5.3新增的闭包语法介绍function() use() {}相关推荐

  1. Swift翻译之-Swift语法入门 Swift语法介绍

    目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...

  2. Python闭包基本介绍与作用

    目录 1.闭包基本介绍 1.1 外函数的返回值是内函数的引用 1.2 外函数把临时变量绑定给内函数 1.3 闭包中内函数修改外函数局部变量 2.闭包的作用 1.闭包基本介绍 "闭包" ...

  3. Linux中常用的tar解压打包命令语法介绍

    常用的tar解压打包命令语法介绍 1.命令格式 2.命令功能 3.命令参数 4.常见解压/压缩命令 5.使用实例 1.命令格式 tar[必要参数][选择参数][文件] 2.命令功能 用来压缩和解压文件 ...

  4. swift语言特性,swift语法介绍,swift使用技巧

    Swift语言特性.Swift语法介绍.Swift使用技巧 Swift是一种由苹果公司开发的编程语言,于2014年首次发布.它是一种现代.快速.安全的编程语言,用于iOS.macOS.watchOS和 ...

  5. 闭包的介绍、构成条件、作用及示例代码

    1. 闭包的介绍 我们学过了函数,我们知道当函数调用完,函数内定义的变量都销毁了,但是我们有时候需要保存函数内的这个变量,每次在这个变量的基础上完成一些列的操作,比如: 每次在这个变量的基础上和其它数 ...

  6. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  7. Markdown 语法介绍

    Markdown 语法介绍 from:https://coding.net/help/doc/project/markdown.html 文章内容 1 Markdown 语法介绍 1.1 标题 1.2 ...

  8. sql和mysql语法_SQL 与MySQL-基本语法介绍

    MySQL-基本语法介绍 简单说:msyql 就是一个仓库, sql就是如何从仓库取(查询.更改)东西,它们是一个组合,在一起亲密合作,缺一不合: MySQL 基本语法介绍 1. 什么是SQL SQL ...

  9. php语法介绍,PHP语法介绍

    php7新特性是什么 php7新特性是什么?在PHP7中由于修改了底层引擎大部分代码,以及通过各种方式提高PHP的性能,所以在PHP7中也增加了一些新的语法,这些语法的使用也能对提高性能有帮助.下面给 ...

最新文章

  1. 自动备份脚本 mysql svn
  2. C#调用淘宝API流程整理
  3. 计算特征数据matlab代码,科学网—MATLAB特征提取代码 - 蒋样明的博文
  4. Github标星2w+,热榜第一,如何用Python实现所有算法
  5. linux 切换用户_Linux 用户态切换到内核态的 3 种方式
  6. 计算机视觉与深度学习 | 粒子群算法与遗传算法(GA)及与蚁群算法(ACO)比较
  7. 【项目介绍】协程——C语言实现的用户态非抢占式轻量级线程
  8. servle 3.0 新特性之一 对上传表单的支持
  9. Runtime的应用
  10. grafana + influxdb + telegraf , 构建性能监控平台
  11. 定期定量采购_采购的四种方法
  12. 【转】恢复默认vs2005
  13. r语言数据变量分段_R语言之数据汇总
  14. 基于VS+Opencv2.4.10的微信跳一跳辅助工具
  15. 搜索引擎优化与信息检索有什么关联
  16. docker创建容器共享目录
  17. SCT1270,SCT1271,12.6V, 7A, 全集成高效升压变换器
  18. STM32学习之DS18B20数字温度传感器
  19. 卸载office时显示的是安装包的语言不支持程序,而且也卸载不了..
  20. Shell 练习题(一)

热门文章

  1. NOI 08 石头剪刀布
  2. 最小生成树,回忆复习篇。
  3. 可适配平板、手机的Web开发方式
  4. 网络编程——第一部分
  5. DevExpress GridControl 导出为Excel
  6. 编写Android.mk中的LOCAL_SRC_FILES,使其自动查找源文件,不需要手动添加
  7. 嵌套地狱_解决嵌套业务逻辑_使用Js的对象_避免数组嵌套---SpringCloud Alibaba_若依微服务框架改造_ElementUI---工作笔记016
  8. java零碎要点---struts2中redirect和redirectAction的区别
  9. 2014年0417的工作计划
  10. 《How to Generate a Good Word Embedding?》导读(转)