php中的闭包,以前不理解。之前项目中虽然有用到,也是别人怎么用,本身也跟着怎么用,也没具体去看一下,时间长了就忘了,也不知道闭包是怎么回事。今天网上搜集了关于php闭包相关的文章,看了7,8篇,干货很少,大都复制粘贴党,如今根据本身的理解小结一下php
闭包支持版本闭包
根据官方文档里说的closure是5.3.0以后才支持以及不少文章说php是5.3.0以后才引入的,也没亲自验证过,暂时就理解为php版本大于5.3.0才有了闭包概念,支持闭包。函数
语法3d
函数:function func ($arg = xxx) {xxx};指针
匿名函数: 没有函数名的函数 好比 function($arg = xxx){xxx};blog
闭包:匿名函数加上use用法 好比 function($arg = xxx)use ($a, $b) {xxx};递归
对比内存
函数:相关语句块的集合,能够根据传入的条件完成一个小功能。文档
匿名函数:虽然有了函数,可是函数起名字是一件较麻烦的事,且在同一命名空间下,函数命名有可能出现重复。一旦出现重复,程序就会报错。因此有了匿名函数。io
闭包:匿名函数的增长版,添加了use用法,申明时获取上下文内容,而不是调用时才获取。
闭包优势
网上说闭包有减小foreach,减小函数参数,减小递归等好处,感受这些和闭包关系不大。我的认为,闭包带来的最大好处在于use。
php中变量有引用一说(其余语言中也有相似的说法),use中的变量存放的多是一个变量的值拷贝,也多是一块内存地址(相似于c语言中的指针)
use中变量存放引用(内存地址)比较好的例子计数器,简易代码以下
$start = 0;
$funcCount = function () use (&$start) {$start++; return $start;};
unset($start);
以上3行代码就定义了一个简单的计数器,变量start销毁后,因为闭包中有对start的引用,因此start以前指向的内存地址不会被回收,此时这块内存地址就脱离程序的掌控,经过$funcCount()能够访问到这块内存,执行计数操做并返回,该地址中的值修改常理来讲只会被该匿名函数修改,不会被其余程序误改。
暂时就说到这里,有不对的地方,欢迎批评指正,共同进步