摘自: http://www.cnblogs.com/starlion/p/3894578.html

一:匿名函数 (在php5.3.0 或以上才能使用)

php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最常用的就是回调函数的参数值。(http://php.net/manual/zh/functions.anonymous.php

匿名函数的定义:

$closureFunc = function(){

    ....

 };

eg: 把匿名函数赋值给变量,通过变量来调用

$closureFunc = function($str){

   echo $str;

  };

  $closureFunc("hello world!");

输出: hello world!

二:闭包

2.1  将匿名函数放在普通函数中,也可以将匿名函数返回,这就构成了一个简单的闭包

function closureFunc1(){
$func = function(){
echo "hello";
};
$func();
}
closureFunc1();
//输出: hello

2.2  在匿名函数中引用局部变量

function closureFunc2(){
$num = 1;
$func = function(){
echo $num;
};
$func();
}
closureFunc2();
//Notice: Undefined variable: num

上面的函数运行后,会报Notice错误,说明我们不能在匿名函数中这样使用局部变量,这时候就要引用一个php的关键字 use, 代码如下

function closureFunc2(){
$num = 1;
$func = function() use($num){
echo $num;
};
$func();
}
closureFunc2();
//输出: 1

2.3  返回匿名函数

function closureFunc3(){
$num = 1;
$func = function() use($num){
echo $num;
};
return $func;
}
$func = closureFunc3(); //函数返回匿名函数
$func(); //然后我们在用$func() 调用
//输出: 1

2.4 当我们在返回匿名函数时候怎么给匿名函数传参呢? 其实跟普通函数传参数一样

function closureFunc4(){
$num = 1;
$func = function($str) use($num){
echo $num;
echo "\n";
echo $str;
};
return $func;
}
$func = closureFunc4();
$func("hello, closure4");
//输出:
//1
//hello, closure4

2.5 怎么用闭包来改变上下文引用的变量值?

function closureFunc5(){
$num = 1;
$func = function() use($num) {
echo "\n";
$num++;
echo $num;
};
echo "\n";
echo $num;
return $func;
}
$func = closureFunc5();
$func();
$func();
$func();
//输出:
// 1
// 2
// 2
// 2

看上面的输入结果,显然没有达到目的, 其实只要加一个 & 引用符号就可以了

function closureFunc5(){
$num = 2;
$func = function() use(&$num) {
echo "\n";
$num++;
echo $num;
};
echo "\n";
echo $num;
return $func;
}
$func = closureFunc5();
$func();
$func();
$func();
//输出:
// 2
// 3
// 4
// 5

2.6 把匿名函数当作参数传递

function callFunc($func){
$func("argv");
} callFunc(function($str){
echo $str;
})
//输出:
// argv

参考:

http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html 为什么要引入闭包

http://blog.csdn.net/lgg201/article/details/6127564  php 5.3.0 的function() use() {}

最新文章

  1. Bootstrap.css 中请求googleapis.com/css?family 备忘录
  2. Java开发中经典的小实例-(输入三个数字判断三角形类型)
  3. web.xml配置解释
  4. vim多行注释和取消多行注释
  5. Python练习题 027:对10个数字进行排序
  6. poj3694Network(tarjan+lca)
  7. 『奇葩问题集锦』Zepto 页面唤醒拨号功能点透
  8. strcpy,memcpy,内存块重叠
  9. 如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China
  10. Android源代码之DeskClock (一)
  11. javascript高级知识分析——作为对象的函数
  12. Android之单击返回键两次退出
  13. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
  14. setTimeout、setInterval被遗忘的第三个参数
  15. hbase数据原理及基本架构
  16. Jenkins 集群搭建
  17. python-socket编程(入门,网络基础)
  18. 【转】Java学习---Java Web基础面试题整理
  19. 《剑指offer》— JavaScript(33)丑数
  20. Golang之字符串格式化

热门文章

  1. Google Chrome浏览器中如何使用命令
  2. 生产环境下的mysql主从复制
  3. 主动模式下FTP的详细工作过程(转) 挺详细
  4. 蓝牙--对象交换协议(OBEX)
  5. Linux内核设计第五周——扒开系统调用三层皮(下)
  6. HTML其他基本格式说明
  7. php://input,php://filter,data URI schema的那些事
  8. Django model '__week_day'与python datetime的weekday()
  9. java 虚拟机--新生代与老年代GC
  10. NSMutableAttributedString 富文本的使用