闭包是一种能够存储变量状态的匿名函数,可以在定义它的所在函数已经退出后执行,保留着所在函数的变量值,因此也称为 匿名函数的 引用封装那些变量。
PHP 中的 Closure 用法详解
什么是闭包(Closure)?
闭包是一种能够存储变量状态的匿名函数,可以在定义它的所在函数已经退出后执行,保留着所在函数的变量值,因此也称为 匿名函数的 引用封装那些变量。
闭包的基本语法
$func = function(parameters) use ($variable) {
// function body
};
$func :闭包函数名,用于后续的调用。
parameters :函数的参数列表。
use :引用外部变量。
$variable :在闭包函数中引用的外部变量。
示例:
function foo($x) {
return function ($y) use ($x) {
return $x + $y;
};
}
$func = foo(10);
echo $func(5); // 输出 15
上述代码创建了一个叫做 foo
的函数,它返回了一个匿名函数,该匿名函数使用了 foo
中的变量 $x
,并通过参数 $y
调用该匿名函数。调用 $func(5)
返回结果为 15
。
闭包中的变量
闭包可以访问和修改创建闭包时对应作用域中的变量。当使用关键字 use
引入外部变量时,将创建对变量的一个引用,而不是拷贝一个副本。
示例:
$x = 1;
$y = 2;
$func = function () use (&$x, $y) {
$x++;
$y++;
echo $x . ' ' . $y;
};
$func(); // 输出 2 3
使用关键字 &
可以引入外部变量的引用,外部变量的值在闭包中被修改,这对于在外部定义一个计数器是非常有用的。
带有作用域的闭包
闭包也支持使用 use
引入一个函数外部的包含作用域变量。
示例:
function foo() {
$x = 1;
$func = function () use ($x) {
echo $x;
};
return $func;
}
$func = foo();
$func(); // 输出 1
在这个示例中,变量 $x
定义在函数 foo
内部,通过使用 use
语句,使得闭包函数可以访问到 $x
变量,该闭包函数存储在 $func
变量中,当 $func
被调用时,输出 $x
变量的值。
闭包的递归
闭包函数递归调用自身,在匿名函数体内引用函数名引用的是定义时的函数,因此需要用到自调用,使得闭包函数体内的递归函数引用实时更新到当前闭包。通过将函数名储存在变量中并在闭包中调用该变量,可以解决这个问题。
示例:
$factorial = function ($n) use (&$factorial) {
return ($n <= 1) ? 1 : $n * $factorial($n -1);
};
echo $factorial(5); // 输出 120
通过引用传递 $factorial
变量,使得递归的闭包函数在函数体内引用最新的闭包版本。
结论
闭包为 PHP 的函数提供了更多的灵活性,使代码更加清晰明了,更加易于维护。同时,若不加注意,也可能会引发变量作用域的问题,需要注意不要造成意外的效果。
本文标题为:php 中的closure用法详解


基础教程推荐
- laravel使用组件实现微信网页授权登入 2023-05-20
- php实现图片压缩处理 2023-05-01
- PHP echo()函数讲解 2022-12-22
- 关于PHP数组迭代器的使用方法实例 2022-09-11
- PHP实现可添加水印与生成缩略图的图片处理工具类 2022-10-05
- tp5(thinkPHP5框架)captcha验证码配置及验证操作示例 2023-01-19
- PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解 2023-04-19
- thinkphp5使用无限极分类 2022-12-22
- php中mysql操作buffer用法详解 2023-08-10
- 了解phpstripos函数的使用方法 2023-10-08