匿名函数与闭包
编写内联函数,并使用 use 捕获变量。
匿名函数与闭包 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
什么是匿名函数
匿名函数(Lambda 函数)是没有名称的函数。在 PHP 中,它是内置 Closure 类的一个实例,可以存储在变量中、作为参数传递,或从另一个函数返回。
基本匿名函数
将函数赋给变量,然后调用该变量:
<?php
$double = function(int $n): int {
return $n * 2;
};
echo $double(5); // 10
echo $double(21); // 42传递匿名函数
将闭包作为参数传递给 array_map、usort 等函数,或传递给您自己的回调函数:
<?php
$nums = [3, 1, 4, 1, 5, 9];
$squared = array_map(function(int $n): int {
return $n ** 2;
}, $nums);
print_r($squared); // [9, 1, 16, 1, 25, 81]返回函数
函数可以创建并返回一个闭包,这是一种工厂模式:
<?php
function makeMultiplier(int $factor): Closure {
return function(int $n) use ($factor): int {
return $n * $factor;
};
}
$triple = makeMultiplier(3);
$tenX = makeMultiplier(10);
echo $triple(5); // 15
echo $tenX(5); // 50闭包与 use
闭包可以通过 use 从外部作用域捕获变量。默认按值(副本)捕获,除非添加 &:
<?php
$taxRate = 0.18;
$addTax = function(float $price) use ($taxRate): float {
return $price * (1 + $taxRate);
};
$taxRate = 0.20; // change outer variable
echo $addTax(100); // 118 — captured value at creation time使用 use(&) 按引用捕获
若要让闭包看到外部变量的更新,请按引用捕获:
<?php
$count = 0;
$increment = function() use (&$count): void {
$count++;
};
$increment();
$increment();
echo $count; // 2箭头函数(PHP 7.4)
箭头函数是简洁的单表达式闭包,会自动按值捕获外部作用域:
<?php
$rate = 1.18;
$prices = [10, 20, 30];
// Arrow function — no 'use' needed
$withTax = array_map(fn($p) => $p * $rate, $prices);
print_r($withTax); // [11.8, 23.6, 35.4]箭头函数不能修改外部作用域
箭头函数只能按值捕获变量,因此无法修改外部变量:
<?php
$total = 0;
$nums = [1, 2, 3];
// This does NOT modify $total!
array_walk($nums, fn($n) => $total += $n);
echo $total; // 0
// Use a reference closure for mutation:
array_walk($nums, function($n) use (&$total) { $total += $n; });
echo $total; // 6作为回调的闭包
许多 PHP 函数接受可调用对象,您可以传递闭包、数组 [$obj, 'method'] 或字符串形式的函数名:
<?php
$words = ['banana', 'apple', 'cherry'];
usort($words, fn($a, $b) => strcmp($a, $b));
print_r($words); // ['apple', 'banana', 'cherry']立即调用的闭包
您可以在同一行定义并调用闭包,这对于创建隔离作用域很有用:
<?php
$result = (function(): int {
$x = 10;
$y = 20;
return $x + $y;
})();
echo $result; // 30
// $x and $y are not in outer scopeClosure::bind 和 bindTo
您可以使用 Closure::bind() 将闭包重新绑定到其他对象的上下文:
<?php
class Counter {
private int $value = 0;
}
$increment = Closure::bind(function(int $by): void {
$this->value += $by;
}, new Counter(), Counter::class);
// Now $increment has access to private $value快速检查
PHP 中,使用 use 的普通闭包与箭头函数之间的主要区别是什么?
回顾:匿名函数和闭包
总结:
- 匿名函数可以存储在变量中,也可以传递给其他代码
- 闭包使用
use($var)按值捕获外部变量,或使用use(&$var)按引用捕获 - 箭头函数(PHP 7.4)会自动按值捕获外部作用域
- 适用于回调:array_map、usort、array_filter……
- 可以从工厂函数中返回
常见问题解答
「匿名函数与闭包」课时是免费的吗?
是的 — 「匿名函数与闭包」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「匿名函数与闭包」这节课中我会学到什么?
编写内联函数,并使用 use 捕获变量。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「匿名函数与闭包」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 定义与调用函数
- 默认参数与可变参数
- 变量作用域:局部与全局
- 匿名函数与闭包