这个是我在博客园上写的一篇文章,我的博客园blog地址:http://www.cnblogs.com/starlion 一:匿名函数 ( 在php5.3.0 或以上才能使用 ) php中的匿名函数(Anonymous functions), 也叫闭包函数( closures ), 允许指定一个没有名称的函数。最常用的就是回调函
这个是我在博客园上写的一篇文章,我的博客园blog地址:http://www.cnblogs.com/starlion
一:匿名函数 (在php5.3.0 或以上才能使用)
php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最常用的就是回调函数的参数值。(http://php.net/manual/zh/functions.anonymous.php)
匿名函数的定义:
<span>$closureFunc</span> = <span>function</span><span>(){
</span>....<span>
};</span>eg: 把匿名函数赋值给变量,通过变量来调用

立即学习“PHP免费学习笔记(深入)”;
<span>$closureFunc</span> = <span>function</span>(<span>$str</span><span>){
</span><span>echo</span> <span>$str</span><span>;
};
</span><span>$closureFunc</span>("hello world!");
立即学习“PHP免费学习笔记(深入)”;
输出: hello world!
二:闭包
2.1 将匿名函数放在普通函数中,也可以将匿名函数返回,这就构成了一个简单的闭包

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc1(){
</span><span>$func</span> = <span>function</span><span>(){
</span><span>echo</span> "hello"<span>;
};
</span><span>$func</span><span>();
}
closureFunc1();
</span><span>//</span><span>输出: hello</span>
立即学习“PHP免费学习笔记(深入)”;
2.2 在匿名函数中引用局部变量

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc2(){
</span><span>$num</span> = 1<span>;
</span><span>$func</span> = <span>function</span><span>(){
</span><span>echo</span> <span>$num</span><span>;
};
</span><span>$func</span><span>();
}
closureFunc2();
</span><span>//</span><span>Notice: Undefined variable: num</span>
立即学习“PHP免费学习笔记(深入)”;
上面的函数运行后,会报Notice错误,说明我们不能在匿名函数中这样使用局部变量,这时候就要引用一个php的关键字 use, 代码如下

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc2(){
</span><span>$num</span> = 1<span>;
</span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>){
</span><span>echo</span> <span>$num</span><span>;
};
</span><span>$func</span><span>();
}
closureFunc2();
</span><span>//</span><span>输出: 1</span>
立即学习“PHP免费学习笔记(深入)”;
2.3 返回匿名函数

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc3(){
</span><span>$num</span> = 1<span>;
</span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>){
</span><span>echo</span> <span>$num</span><span>;
};
</span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc3(); //函数返回匿名函数
</span><span>$func</span><span>(); //然后我们在用$func() 调用
</span><span>//</span><span>输出: 1</span>
立即学习“PHP免费学习笔记(深入)”;
2.4 当我们在返回匿名函数时候怎么给匿名函数传参呢? 其实跟普通函数传参数一样

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc4(){
</span><span>$num</span> = 1<span>;
</span><span>$func</span> = <span>function</span>(<span>$str</span>) <span>use</span>(<span>$num</span><span>){
</span><span>echo</span> <span>$num</span><span>;
</span><span>echo</span> "\n"<span>;
</span><span>echo</span> <span>$str</span><span>;
};
</span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc4();
</span><span>$func</span>("hello, closure4"<span>);
</span><span>//</span><span>输出:
//1
//hello, closure4</span>
立即学习“PHP免费学习笔记(深入)”;
2.5 怎么用闭包来改变上下文引用的变量值?

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc5(){
</span><span>$num</span> = 1<span>;
</span><span>$func</span> = <span>function</span>() <span>use</span>(<span>$num</span><span>) {
</span><span>echo</span> "\n"<span>;
</span><span>$num</span>++<span>;
</span><span>echo</span> <span>$num</span><span>;
};
</span><span>echo</span> "\n"<span>;
</span><span>echo</span> <span>$num</span><span>;
</span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc5();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>//</span><span>输出:
// 1
// 2
// 2
// 2</span>
立即学习“PHP免费学习笔记(深入)”;
看上面的输入结果,显然没有达到目的, 其实只要加一个 & 引用符号就可以了

立即学习“PHP免费学习笔记(深入)”;
<span>function</span><span> closureFunc5(){
</span><span>$num</span> = 2<span>;
</span><span>$func</span> = <span>function</span>() <span>use</span>(&<span>$num</span><span>) {
</span><span>echo</span> "\n"<span>;
</span><span>$num</span>++<span>;
</span><span>echo</span> <span>$num</span><span>;
};
</span><span>echo</span> "\n"<span>;
</span><span>echo</span> <span>$num</span><span>;
</span><span>return</span> <span>$func</span><span>;
}
</span><span>$func</span> =<span> closureFunc5();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>$func</span><span>();
</span><span>//</span><span>输出:
// 2
// 3
// 4
// 5</span>
立即学习“PHP免费学习笔记(深入)”;
2.6 把匿名函数当作参数传递

立即学习“PHP免费学习笔记(深入)”;
<span>function</span> callFunc(<span>$func</span><span>){
</span><span>$func</span>("argv"<span>);
}
callFunc(</span><span>function</span>(<span>$str</span><span>){
</span><span>echo</span> <span>$str</span><span>;
})
</span><span>//</span><span>输出:
// argv</span>
立即学习“PHP免费学习笔记(深入)”;
参考:
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怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号