PHP 闭包怎么用

在日常写代码时,我们常会遇到“临时用一段小功能,却不想单独写个函数”的情况,比如给商品列表加个临时排序规则、统计文章标签的出现次数,这时候PHP里的闭包就能派上用场。它就像一个“随身小工具”,不用单独装盒子,拿出来就能用,用完还能灵活收好,比普通函数更省心。

什么是PHP闭包?用买菜举例子

简单说,闭包就是“装在变量里的小函数”,它能记住自己创建时的周边环境。比如你去菜市场买菜,身上带了30块钱,这30块就是“环境”;闭包就像你随身带的小计算器,它会一直记得你初始的30块,哪怕你中途又加钱,它也能结合当前的钱数算总价,不会丢了初始的本钱。

PHP 闭包怎么用

用PHP代码说,就是把function()直接赋值给变量,这个变量就是闭包,它能“记住”创建时的外部变量,比如:

`php

$initialMoney = 30; // 初始带的钱

$calculateCost = function($vegetablePrice) use ($initialMoney) {

return $initialMoney - $vegetablePrice; // 用了use记住初始的钱

};

echo $calculateCost(12); // 输出18,正好是30减12

`

这里的$calculateCost就是闭包,它靠use关键字“抓住”了外面的$initialMoney,要是没写use,它就认不出这个变量,算出来的结果会出错。

闭包的3个实用场景,比普通函数更顺手

给数组处理加临时规则,不用单独写函数

平时统计用户的积分等级,可能需要给不同积分的用户加不同标签。要是单独写个函数处理,得额外命名,写完还要删,麻烦。用闭包就能直接写在处理数组的地方,比如给积分数组打标签:

`php

$userPoints = [80, 150, 220];

$userLevels = array_map(function($point) {

if ($point < 100) return '青铜';

if ($point < 200) return '白银';

return '黄金';

}, $userPoints);

// 输出:青铜、白银、黄金

`

这里的闭包直接跟着array_map走,处理完就结束,不用额外写函数,代码看着也清楚。

回调函数里用,不用传一堆参数

做电商后台时,要统计每个分类下的商品数量,这时候调用array_filter筛选商品,要是用普通函数,得把分类ID当参数传,还容易乱。用闭包就能“抓住”分类ID,直接用:

`php

$categoryId = 3; // 要统计的分类ID

$goodsList = [

['id' => 1, 'category' => 3],

['id' => 2, 'category' => 5],

['id' => 3, 'category' => 3]

];

$categoryGoods = array_filter($goodsList, function($good) use ($categoryId) {

return $good['category'] == $categoryId;

});

// 筛选出分类3的2个商品

`

闭包记住了$categoryId,筛选时直接用,不用每次传参数,省了不少事。

临时修改类的方法,不用改原代码

做网站时,要是想用别人写的类,但只需要改个小逻辑,比如商品类的价格显示,不想改原类的代码,用闭包就能“临时替换”。比如用Closure::bind把闭包绑定到类上,让它能访问类的私有属性,不用改原类的代码。

用闭包的小提醒,别踩坑

闭包虽然方便,但有两个小细节要注意:一是use关键字里的变量是“传值”还是“传引用”,要是想让闭包修改外部变量,得用use (&$var),不然闭包改的是自己的副本,外部变量不变;二是闭包用完会占一点内存,要是用在循环里,别创建太多没用到的闭包,不然会拖慢性能。

其实PHP闭包就是“临时小函数”,不用单独定义,随用随写,专门解决“临时用一段小逻辑”的场景,掌握了它,写代码时能少写不少冗余的小函数,逻辑也更清晰。

上一篇 Swift语言的核心特性及在iOS开发场景中的应用优势科普