PHP闭包进阶与函数式组合
PHP从5.3开始支持闭包,从7.4开始支持箭头函数。今天说说闭包的进阶用法和函数式组合。
闭包可以捕获外部变量。按值捕获和按引用捕获不同。
```php
$prefix = "用户: ";
$formatName = function (string $name) use ($prefix): string {
return $prefix . $name;
};
echo $formatName("张三") . "\n";
$counter = 0;
$increment = function () use (&$counter) {
$counter++;
};
$increment();
$increment();
echo $counter . "\n";
?>
函数工厂返回闭包。
```php
function createDiscount(float $rate): Closure
{
return fn(float $price) => round($price * (1 - $rate), 2);
}
$vipDiscount = createDiscount(0.2);
$seasonalDiscount = createDiscount(0.15);
echo "VIP价: " . $vipDiscount(299) . "\n";
echo "季末价: " . $seasonalDiscount(299) . "\n";
?>
函数组合可以把多个小函数组合成复杂的处理流程。
```php
function pipe(callable ...$fns): Closure
{
return function ($value) use ($fns) {
foreach ($fns as $fn) $value = $fn($value);
return $value;
};
}
$trim = fn(string $s): string => trim($s);
$lower = fn(string $s): string => strtolower($s);
$slug = fn(string $s): string => preg_replace('/\s+/', '-', $s);
$shorten = fn(string $s): string => substr($s, 0, 50);
$makeSlug = pipe($trim, $lower, $slug, $shorten);
echo $makeSlug(" Hello World! ") . "\n";
?>
柯里化把多参数函数转换成单参数函数链。
```php
function curry(callable $fn, ...$args): Closure
{
return function (...$newArgs) use ($fn, $args) {
$all = array_merge($args, $newArgs);
$ref = new ReflectionFunction($fn);
if (count($all) >= $ref->getNumberOfRequiredParameters()) {
return $fn(...$all);
}
return curry($fn, ...$all);
};
}
function add(int $a, int $b, int $c): int
{
return $a + $b + $c;
}
$curried = curry('add');
$add5 = $curried(5);
echo $add5(10, 20) . "\n";
?>
>
闭包是PHP函数式编程的基础。理解闭包的工作原理后,写出来的代码会更灵活。闭包用在回调、事件处理、路由处理、中间件中都很常见。
PHP闭包进阶与函数式组合
张小明
前端开发工程师
数据科学求职三份简历策略:精准匹配岗位语义分裂
1. 为什么“永远准备三份简历”是数据科学求职者最被低估的硬核策略在数据科学求职圈里,我见过太多人把90%精力花在刷LeetCode、调参炼丹、复现顶会论文上,却在简历这道门槛前栽得莫名其妙——明明项目经历扎实,GitHub星标过百,Ka…
基于MC68HC16Z1的实时音频频谱显示系统:DSP算法与硬件协同设计
1. 项目概述与核心思路最近在整理一个老项目的资料,翻出来一个基于MC68HC16Z1微控制器的经典设计:一个实时的音频频谱显示系统。这个项目的核心,是把模拟的音频信号,通过微控制器内部的ADC采样进来,然后用数字信号处理…
NT5CC128M16JR-EKI现货与DDR3存储器件小批量采购说明
NT5CC128M16JR-EKI 是客户常询的 NANYA DDR3 存储器件方向型号之一,常见于工业控制、通信设备、嵌入式终端、仪器仪表及部分电子制造项目中。对于这类型号,采购人员通常会关注品牌、容量、封装、批次、交期和项目供货稳定性。深智微科技长期服务汽车电子…
i.MX 8启动时间精确测量:GPIO脉冲标记法实战指南
1. 项目概述与核心价值在嵌入式系统开发,尤其是工业控制、汽车电子和高端消费电子领域,系统启动时间是一个至关重要的性能指标。想象一下,一台智能工厂的机械臂或者一台高端医疗设备,从按下电源键到完全就绪,每节省一秒…
Claude Code Worktree(工作树) 完整实战指南(本地并行开发、分支管理、避坑全解)
简介 在日常使用 Claude Code 开发时,经常会遇到开发新功能中途突发线上 Bug、多任务并行编码、多会话同时运行的场景。如果直接开启多个 Claude 终端修改同一份代码,极易出现文件互相覆盖、代码混乱的问题。 Git 原生 worktree 结合 Claude Code 专属能…