PHP 匿名函数怎么用

刚接触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借外部变量,和数组函数搭配时尤其顺手,是简化代码、提升开发效率的小工具。

上一篇 JavaScript 函数参数怎么传