PHP的学习

理解闭包、闭包函数、匿名函数总结

2017-02-17  本文已影响71人  陈钢镚学财

前言


从知乎上看到一篇文章,里面对php栈后端和java栈后端有一个非常贴切的类比。
气宗与剑宗。
php栈,是剑宗,成效极快,修为突飞猛进,但是根基不稳,空间有限。
java栈,是气宗,从基础到应用,按部就班,稳扎稳打,你得耐得住前期的寂寞,才能有后来水到渠成的收获。

可以看出,php栈的优势在于,成效快,几十天就能上手。而java,则必须奠定基础,说不定半年一年的,都还在积累过程中。
相反,php可能到了某个程度,再想深入,却由于基础薄弱,后继无力。

既然知道不足,那便去弥补起来,打扎实基础,一样可以笑傲江湖。

闭包


指,将“从其他作用域中”取得的变量、引用,保存起来的一个整体。
这个整体,就是闭包,它实际上必须能做两件事:

  1. 利用某个规则(作用域链)取得其他作用域下的变量和引用
  2. 为这些“非法”得来的变量和引用,提供一个让其继续保存下去的堆栈资源。

至于,你利用闭包做什么,是利用return传递这个闭包,还是用其他形式处理闭包,那就是你的事情了
简单的讲,只要一种做法(一段代码),达到了上面的两个功能(特性),那他就是个闭包

闭包函数


闭包函数是指:

  1. 以函数的方式来实现一个闭包,
  2. 是在某个场景下,函数达到了闭包的两个功能(特性),尽管你不是主观的想要实现这个闭包,但客观上,它已经是一个闭包了

所以,可以得出,闭包函数,本质上就是一个闭包,是一个用函数的形式来实现的闭包。
简单的说,闭包函数就是闭包的一个载体,所以它本身必然是一个闭包。
但是闭包函数是一个比较灵活的闭包,它还可以实现除闭包的两个功能以外,其他的一些功能,如:我在闭包函数里alert(javascript)或者echo(php)了……
所以,从范围来讲,闭包是闭包函数的超集,从表现上来讲,闭包函数是闭包的一次实现

注意:既然闭包可以保留一些值不被释放,那么,越多的闭包就意味着越多的内存资源被持续占用。

匿名函数


搜资料,并没有搜到一个统一的定义。
个人认为,匿名函数在不同的语言之中,应该都具备没有名称、临时创建这两个特性。
以PHP官方文档的定义为例:
匿名函数(Anonymous function),也叫闭包函数(closures)。指,允许临时创建一个没有指定名称的函数。
最常见的应用场景是:作为一个回调函数。
这里有一个问题,匿名函数和闭包函数一样吗?
不从PHP讲,匿名函数和闭包函数的定义应该是不一样的。
PHP中,匿名函数可以当作一个特殊的数据类型,可以在变量间相互赋值,传递,与字符串型、数值型是平等的。
那么,匿名函数就会通常用于实现一个闭包,个人猜想,这就是匿名函数也叫闭包函数的原因吧。

最后的声明


本文中所有的观点,都是本人个人意见与理解,并不一定是对的,权当给大家理解这些东西时的一个参考,许多错误之处,恳请大神指点。

上一篇下一篇

猜你喜欢

热点阅读