一:匿名函数 (在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, 代码如下

    $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/starlion/p/3894578.html

参考:

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() {}

 

php中的匿名函数(Anonymous functions)和闭包函数(closures)的更多相关文章

  1. day12 函数的嵌套调用 闭包函数,函数对象

    函数嵌套: 函数嵌套: 嵌套指的是,一个物体包含另一个物体,函数嵌套就是一个函数包含另一个函数 按照函数的两个阶段 嵌套调用 指的是在函数的执行过程中调用了另一个函数,其好处可以简化外层大函数的代码, ...

  2. python 函数的作用域,闭包函数的用法

    一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...

  3. php函数总结(闭包函数,匿名函数)

    php函数总结 1.普通函数 2.变量函数 function myfun($a) { echo $a; } $b = "myfun"; $b("test"); ...

  4. php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  5. 转:php中的匿名函数和闭包(closure)

    一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...

  6. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  7. day12:闭包函数&匿名函数

    闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...

  8. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  9. Js闭包函数

    一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. ( ...

随机推荐

  1. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  2. 【解决】国内访问github过慢

    github在国内慢的有点不能忍了,受不了了google了一下有什么方法没,还真找到一些方法. 死马当活马医,操作完之后确实速度上快了一些,但是毕竟国情所限,仍然做不到“秒开”. 主要是参考两篇博客: ...

  3. weiphp3.0(thinkphp)的调整之路

    weiphp是在thinkphp的基础上开发的简洁强大开源的微信公众平台开发框架,其宣称微信功能插件化开发,多公众号管理,配置简单. 但是关于weiphp的文档使用一是内容真不多,二是写的也不详细. ...

  4. hdu3315-My Brute(费用流 or KM算法)

    题目:My Brute Seaco是一个漂亮的妹子,喜欢玩一款名叫My Brute的游戏.情人节快到了,starvae和xingxing都想邀请妹子过节,但是妹子只能陪一个啊,于是两个人决定打一架,用 ...

  5. [转]windows下srand48()和drand48()的问题

    转自:windows下srand48()和drand48()的问题 #ifndef DRAND48_H #define DRAND48_H #include <stdlib.h> #def ...

  6. hdu 5464 Clarke and problem dp

    Clarke and problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...

  7. Linux curl命令详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...

  8. IOS debug网络PonyDebugger 实践篇

    引言:  PonyDebugger是一个很给力的iOS调试工具,它的监视器安装在Chrome浏览器下做为插件使用,通过监视器和PonyDebugger的iOS SDK相辅相成,可以很好的监视App的运 ...

  9. J2EE的13个规范之(三) Servlet简单介绍

    Servlet是一种server端脚本,它是一个特殊的Java类,继承自HttpServlet.开发中主要用于处理和响应client的请求. Servlet在容器中执行,事实上例的和销毁创建由容器进行 ...

  10. 文件I/O(不带缓冲)概述

    一.引言 UNIX系统中大多数文件I/O只需用到5个函数:open.read.write.lseek以及close.这些函数经常被称为不带缓冲的I/O(unbuffered I/O).术语不带缓冲指的 ...