PHP中如何为匿名函数分配参数值及$item变量取值原理问询
PHP匿名函数参数与集合map方法的疑问解答
1. 如何在PHP中为匿名函数分配参数值?
匿名函数的参数处理和普通函数基本一致,但如果需要用到外部作用域的变量,还有专门的use语法,我分两种场景给你讲:
直接调用时传递参数
你可以像定义普通函数一样给匿名函数声明参数,调用的时候直接传入对应的值就行:
// 定义一个带参数的匿名函数,用来生成问候语 $greetUser = function(string $name) { return "Hey, $name! Welcome aboard."; }; // 调用时传入参数值 echo $greetUser('Charlie'); // 输出:Hey, Charlie! Welcome aboard.
捕获外部作用域的变量(闭包特性)
如果匿名函数需要用到它定义时所在作用域的变量,就得用use关键字把变量“拉”进函数里。如果要修改外部变量,还要加引用符号&:
// 外部变量 $discountRate = 0.1; // 用use捕获$discountRate,计算折扣后价格 $calculateDiscountedPrice = function(float $originalPrice) use ($discountRate) { return $originalPrice * (1 - $discountRate); }; echo $calculateDiscountedPrice(100); // 输出:90 // 如果要修改外部变量,需要传引用 $total = 0; $addToTotal = function(float $amount) use (&$total) { $total += $amount; }; $addToTotal(50); $addToTotal(30); echo $total; // 输出:80
2. 代码中$item变量的值如何从$products中获取?
先看你给出的这段代码:
$products = $products->map(function($item){ $item->getCustomPrices($this->user->client); $item->getMarkUpPrices($this->user->client); return $item; });
这里的$products应该是一个集合对象(最常见的是Laravel框架里的Collection,当然其他类库也可能实现类似的map方法)。map方法的核心作用就是遍历集合里的每一个元素,对每个元素执行你传入的匿名函数,最后返回一个包含处理后元素的新集合。
具体到$item的来源:
- 当你调用
$products->map()时,map方法会自动遍历$products集合中的每一个元素。 - 每遍历到一个元素,它就会把这个元素作为参数传递给匿名函数的
$item参数。比如第一次遍历,$item就是集合里的第一个产品对象;第二次就是第二个,以此类推。 - 你在匿名函数里对
$item调用了两个价格处理方法,最后返回处理后的$item,map会把这些返回的元素收集起来,组成新的集合,再赋值回$products。
说白了,map方法帮你做了“遍历集合→把每个元素传给你的函数→收集结果”这一套流程,$item就是当前正在被处理的那个集合元素。
内容的提问来源于stack exchange,提问作者Ervan Prastyanto
相关产品推荐
相关产品推荐

