1、语句结构

在PHP中,由于存在函数内部不能访问全局作用的,所以就需要一种可以引入上一级作用域的语法结构,这种就是

function () use () {}

将需要引入到这个函数作用于内的变量写入到use的括号里面就可以了:

<?php

$a = 1;

$closure = function () use ($a) {
echo $a;
}; $closure(); ?>

输出为:1

2、变量执行的时候是运行时赋值还是函数声明的时候赋的值?

例子:

<?php

$a = 1;

$closure = function () use ($a) {
echo $a;
}; $closure(); $a=2; $closure(); ?>

输出为:1  1;

对于PHP来说的闭包当声明闭包的时候,就已经将值重新开辟了一块内存赋值给了use中的a所以,不过外部的a所以,不过外部的a怎么变,闭包执行的结果是不变的;

PHP实现闭包的本质其实是将这个特殊的函数转换成了一个类;

既然是类,那么我们可以使用引用来传递use当中的值

<?php

$a = 1;

$closure = function () use (&$a) {//注意这里,加了一个&
echo $a;
}; $closure(); $a=2; $closure(); ?>

输出:1  2;

不仅如此,引用之后,如果在闭包当中修改引入的变量值,原本的变量的值也会修改的,但是不过不加&,那么在闭包中修改变量的值得时候,即使这次修改有效了,下次重新运行闭包函数后又会回到之前的值,相当于没有修改。举个例子:

不加&:

<?php
$a = 1;
$closure = function () use ($a) {
$a++;
echo $a,' ';
};
$closure();
$closure();
$a=-5;
$closure();
$closure();
?>

输出为:2  2  2  2;

加了&之后

输出为:2  3  -4  -3;

总结:

对应PHP中的闭包,和JS中的闭包还是有本质的区别的,JS的闭包是语言原生支持的,所以感觉比较符合人的思考方式,而PHP得闭包就是将闭包的这种特性抽象成了类的方式,然后以类的形式进行处理,毕竟是抽象出来的,还不是很符合人们的思考方式。

在接触了PHP的闭包之后,我深深的觉得PHP真是杂啊………………

PS:

1、不要忘记了在闭包的赋值语句最后面的分号,毕竟这是一个语句,还要是有分号的。

2、对于函数的传入参数等东西,和普通的参数写法是一样的。

3、要注意函数调用的时候不要忘记了,因为闭包函数的本质还是一个变量的,不过是一个可以执行的变量了而已。如果去掉,因为闭包函数的本质还是一个变量的,不过是一个可以执行的变量了而已。如果去掉,PHP解释器将会认为这是一个函数而不是一个闭包函数从而出错。

4、除了上面的那几点和JS的不同以外,其他的都是可以的,比如可以作为函数的返回值等等的内容。

最新文章

  1. [译]2016年深度学习的主要进展(译自:The Major Advancements in Deep Learning in 2016)
  2. as3 同屏1000+动画,不掉帧。解决方案。
  3. 浅谈JavaScript中的定时器
  4. iOS官方Sample大全
  5. Win2D 官方文章系列翻译 - 幕后绘制
  6. wifi密码破解-Linux工具篇-video
  7. RESTFul中的那些事(1)---在RESTFul中,HTTP Put和Patch操作的差别?
  8. python退格、方向键无法正常使用解决方法
  9. Canvas 雾玻璃
  10. C# The process cannot access the file because it is being used by another process
  11. 1--OC -- HelloWorld
  12. GoogleNet:inceptionV3论文学习
  13. 201521123092《java程序设计》第九周学习总结
  14. SSM之框架整合
  15. SNOI 2019 字符串
  16. MVC部署阿里云躺过的坑
  17. Mybatis sql映射文件浅析 Mybatis简介(三) 简介
  18. CSS之清除浮动(span/clearfix)
  19. DSO windowed optimization 代码 (1)
  20. udp编程 实例

热门文章

  1. Comet OJ - Contest #11 D isaster 重构树+倍增+dfs序+线段树
  2. java8 stream流操作的flatMap(流的扁平化)
  3. 生产者和消费者之间的线程通讯wait()
  4. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别
  5. docker安装redis,并用配置启动
  6. 解决Powershell中不能运行脚本问题
  7. 线性dp,分层图思想
  8. Graphics 使用一点点注意
  9. SpringBoot几种定时任务的实现方式 和多线程执行任务
  10. Android下文件访问的权限