PHP函数式编程简介
函数式编程(FP)是一种将计算视为数学函数计算的编程范式,避免状态改变和可变数据。虽然PHP最初被设计为命令式语言,但从5.3版本(2009年)开始,PHP加入了强大的函数式编程工具:匿名函数、闭包、高阶函数支持等。
在本文中,我们将深入探讨PHP中函数式编程的所有关键概念——从基础的匿名函数到柯里化和函数组合等高级技术。您将学习如何编写更清晰、更可预测、更易测试的代码。
1. 匿名函数和闭包
匿名函数
匿名函数(Lambda)是没有名称的函数。它可以赋值给变量、作为参数传递或从另一个函数返回。
<?php// 普通匿名函数$square = function($n) { return $n * $n;};
echo $square(5); // 25
// 作为array_map回调的匿名函数$numbers = [1, 2, 3, 4];$squared = array_map(function($n) { return $n * $n;}, $numbers);
print_r($squared); // [1, 4, 9, 16]?>闭包
闭包是一种可以捕获外部作用域变量的匿名函数,通过use关键字实现。这是PHP中函数式编程最强大的特性之一。
<?php$multiplier = 3;
$multiply = function($n) use ($multiplier) { return $n * $multiplier;};
echo $multiply(10); // 30
// 可变变量(通过引用传递)$counter = 0;$increment = function() use (&$counter) { $counter++;};
$increment();$increment();echo $counter; // 2?>2. 纯函数与数据不可变性
纯函数
纯函数是指:
- 对于相同的参数始终返回相同的结果(确定性)
- 没有副作用(不修改外部变量、不输出数据、不操作数据库)
<?php// 非纯函数(依赖全局变量)$taxRate = 0.2;function calculatePriceDirty($price) { global $taxRate; return $price * (1 + $taxRate);}
// 纯函数function calculatePricePure($price, $taxRate) { return $price * (1 + $taxRate);}
echo calculatePricePure(100, 0.2); // 120 — 始终可预测?>不可变性
在函数式编程中,通常不修改现有数据,而是创建新数据。在PHP中,可以使用不可变对象或直接返回新数组来实现。
<?php// 不好:修改原始数组$numbers = [1, 2, 3];array_push($numbers, 4); // 变异
// 好:创建新数组$numbers = [1, 2, 3];$newNumbers = array_merge($numbers, [4]);
// 返回新数组的函数function addItem(array $arr, $item): array { $result = $arr; $result[] = $item; return $result;}
$original = [1, 2];$updated = addItem($original, 3);print_r($original); // [1, 2] — 原始数组未改变print_r($updated); // [1, 2, 3]?>3. 高阶函数:array_map, array_filter, array_reduce
高阶函数是接受其他函数作为参数或返回函数的函数。PHP内置了三个用于函数式数组操作的关键函数。
array_map — 元素转换
<?php$users = [ ['name' => 'Alice', 'age' => 25], ['name' => 'Bob', 'age' => 30],];
// 仅提取姓名$names = array_map(function($user) { return $user['name'];}, $users);
print_r(