• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

PHP中的闭包

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

语法   function () use () {}

例子:

<?php

$a = 1;

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

$closure();

?>

输出为:1

这次就实现了闭包的功能了,可以和上级作用域产生了联系。

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

学过JS的到这里一定认为这个$a变量当变化的时候,根据JS引用的理论,函数执行的结果也是变化的,但事实究竟是这样么?看例子:

<?php

$a = 1;

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

$closure();

$a=2;

$closure();

?>

大家猜猜结果会是什么?

1 1

哎??为什么不是 1 2 呢?

因为对于PHP来说的闭包当声明闭包的时候,就已经将值重新开辟了一块内存赋值给了use中的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得闭包就是将闭包的这种特性抽象成了类的方式,然后以类的形式进行处理,毕竟是抽象出来的,还不是很符合人们的思考方式。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap