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

php : 匿名函数(闭包) [一]的更多相关文章

  1. 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  2. php : 匿名函数(闭包) [二]

    摘自: http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html php的闭包(Closure)也就是匿名函数.是PHP5.3引入的. ...

  3. javascript匿名函数 闭包

    匿名函数 (function(){                console.info("111111111");            })(); var my = (fun ...

  4. PHP匿名函数(闭包)

    匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...

  5. php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法

    1.认识  __set  (在给不可访问属性赋值时,__set() 会被调用) 也就是说你再访问一个类里面没有的属性,会出发这个方法 class A{ private $aa = '11'; publ ...

  6. Go语言 - 函数 | 作用域 | 匿名函数 | 闭包 | 内置函数

    函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 介绍 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于“一等公民”. 函数可以赋值给变量 函数 ...

  7. PHP函数(六)-匿名函数(闭包函数)

    匿名函数能够临时创建一个没有名称的函数,常用作回调函数参数的值 <?php $test = function($a){ echo "Hello,".$a; }; $test( ...

  8. JS匿名函数&闭包

    <html> <head> <title> test </title> </head> <body> <script ty ...

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

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

随机推荐

  1. 【iCore3 双核心板】例程二十七:DMA LAN实验——高速数据传输测速

    实验指导书及代码包下载: http://pan.baidu.com/s/1o7qnCUI iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. most queries (more than 90 percent) never hit the database at all but only touch the cache layer

    https://gigaom.com/2011/12/06/facebook-shares-some-secrets-on-making-mysql-scale/ Facebook shares so ...

  3. Tomcat调优

    问题定位 对于Tomcat的处理耗时较长的问题主要有当时的并发量.session数.内存及内存的回收等几个方面造成的.出现问题之后就要进行分析了. 1.关于Tomcat的session数目 这个可以直 ...

  4. C# DataGrid合并单元格

    1.栏位枚举 private enum DataGridColumn { ROWNUM = , EMPID, EMPNAME, SEX, SALARY, ADRRESS, PHONE, TEL, PO ...

  5. 在MVC3中修改KindEditor实现图片删除

    编辑器KindEditor可以上传图片,但却不能删除图片,因此我们通过修改一些文件,对KindEditor进行扩展,使得KindEditor能删除服务器上的图片. 主要方法就是:在图片空间中浏览图片, ...

  6. 探索.git目录

    .git目录 下面就开始进入.git目录,通过“ls”命令可以看到.git目录中的文件和子目录: 对于这些文件和目录,下面给出了一些基本的描述. hooks:这个目录存放一些shell脚本,可以设置特 ...

  7. java netty之ServerBootstrap的启动

    通过前面的几篇文章,对整个netty部分的架构已经运行原理都有了一定的了解,那么这篇文章来分析一个经常用到的类:ServerBootstrap,一般对于服务器端的编程它用到的都还算是比较的多..看一看 ...

  8. [Android Tips] 7. 以调试模式启动应用

    adb shell am set-debug-app -w {package_name}

  9. Java -- 在Eclipse上使用Spring

    在.NET上用的VS.NET+Spring.net+Nhibernate,到了Java平台上,自然对应着Eclipse+Spring+Hibernate.上一篇文章介绍了如何在Eclipse上使用Hi ...

  10. 5.echo(),print(),print_r()的区别

    echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print()    只能打印出简单类型变量的值(如int,string) print_r() ...