PHP 匿名函数怎么用
刚接触PHP的开发者,大概率都遇过这种场景:写代码时需要临时用一个简单的功能,比如给数组里的每个元素加个固定值,或者过滤掉不符合条件的内容,要是单独写一个函数,翻来翻去找代码太麻烦,不用的话又没法直接嵌在逻辑里,这时候PHP的“匿名函数”就能派上用场了。它就像你出门时带的一次性口罩,需要用的时候拿出来,用完就丢,不用特意准备收纳包或者提前消毒,灵活又省心。
什么是PHP匿名函数?
先给个最接地气的解释:匿名函数就是没有名字的函数。我们平时写的普通PHP函数,都是这样的:

`php
// 普通函数,有名字叫add
function add($a, $b) {
return $a + $b;
}
// 调用的时候要写函数名
echo add(2, 3); // 输出5
`
但匿名函数不一样,它没有名字,你可以把它当成一个“临时的小工具”,直接塞在需要用到的地方,不用提前声明。就像你帮朋友带奶茶,不用特意去“奶茶店”这个固定场所,直接路过便利店就可以买,买完就走,不用留个专属的“奶茶店”招牌。
怎么用匿名函数?第一步:赋值给变量
匿名函数不能单独写,得先把它“存”起来,最常用的方式就是赋值给一个变量。就像你把一次性口罩放进兜里,需要用的时候掏出来就行。
比如,你要给一个数字数组里的每个数都加10,用匿名函数可以这么写:
`php
// 把匿名函数赋值给变量$addTen
$addTen = function($num) {
return $num + 10;
};
// 调用的时候直接用变量名加括号,和普通函数一样
$numbers = [1, 2, 3];
$result = array_map($addTen, $numbers);
// 输出[11,12,13]
print_r($result);
`
这里的$addTen就是一个匿名函数,它没有自己的名字,但是存了一段“给数字加10”的代码逻辑,用变量调用和用函数名调用效果完全一样,只是不用单独写一个函数声明。
进阶用法:访问外部变量(use关键字)
很多人刚用匿名函数时会踩一个坑:如果匿名函数里需要用到外面的变量,直接写会报错。比如你要给数组里的数加一个自定义的“偏移量”,这个偏移量是外面定义的,直接这么写不行:
`php
$offset = 5;
// 报错!匿名函数里访问不到外面的$offset
$addOffset = function($num) {
return $num + $offset;
};
`
这时候就需要用到use关键字,它的作用是把外面的变量“借”进匿名函数里,就像你借朋友的伞出门,用完就还,不会把伞据为己有。正确写法是:
`php
$offset = 5;
// 用use把$offset借进来
$addOffset = function($num) use ($offset) {
return $num + $offset;
};
$numbers = [1, 2, 3];
$result = array_map($addOffset, $numbers);
// 输出[6,7,8]
print_r($result);
`
这里要注意:use是“值传递”,如果外面的$offset后面改了,匿名函数里的$offset不会自动变。比如你再把$offset改成10,调用$addOffset时还是加5,不会自动加成10,就像你借了一把今天能用的伞,明天伞坏了,不用你负责,你借的时候是什么样,用的时候就是什么样。
最实用的场景:给数组处理逻辑“打补丁”
匿名函数最常用的地方,其实是和PHP的数组函数配合用,比如array_map(给每个元素改值)、array_filter(过滤元素)、usort(给数组排序)这些。比如你要过滤掉数组里价格低于100的商品,用匿名函数写一行就能搞定,不用单独写一个过滤函数:
`php
// 商品数组,每个元素是带价格的关联数组
$goods = [
['name' => 'T恤', 'price' => 89],
['name' => '裤子', 'price' => 199],
['name' => '鞋子', 'price' => 299],
];
// 过滤掉价格低于100的商品
$cheapGoods = array_filter($goods, function($item) {
return $item['price'] >= 100;
});
print_r($cheapGoods);
// 输出后两个商品,第一个被过滤掉
`
这里的匿名函数直接嵌在array_filter的参数里,相当于给这个过滤逻辑“临时写了个小规则”,不用单独声明一个叫filterCheapGoods的函数,代码看起来更简洁,不会被很多没用的函数名打乱逻辑。
总的来说,PHP匿名函数就是一个“临时的小功能块”,不用提前命名、不用单独存,哪里需要就往哪里塞,用use借外部变量,和数组函数搭配时尤其顺手,是简化代码、提升开发效率的小工具。