PHP中的函数式编程:从基础到实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的函数式编程:编写代码的现代方式

PHP传统上与命令式和面向对象编程风格相关联。然而,随着7.4、8.0和8.1版本的发布,该语言获得了用于函数式编程(FP)的强大工具。这种范式方法使您能够编写更可预测、可测试且简洁的代码,尤其是在处理数组、集合和异步任务时。在本文中,我们将分解PHP中FP的关键概念,并展示如何在实际中应用它们。



1. PHP中函数式编程的基础

函数式编程建立在几个基本原则之上:

  • 纯函数 — 结果仅取决于参数,没有副作用。
  • 不可变性 — 数据不被修改,而是创建新副本。
  • 高阶函数 — 接受其他函数作为参数或返回函数的函数。
  • 递归 — 用自调用函数替代循环。

得益于匿名函数(闭包)、箭头函数(自PHP 7.4起)以及内置数组函数,PHP支持这些概念。



// Example of a pure functionfunction add(int $a, int $b): int {    return $a + $b;}

// Example of an anonymous function (closure)$multiply = function(int $x, int $y): int { return $x * $y;};

echo $multiply(3, 4); // 12

重要提示: PHP中的纯函数不应修改全局变量或执行输入/输出(例如echo)。这确保了可预测性并简化了调试。



2. 匿名函数、闭包和箭头函数

匿名函数(闭包)是没有名称的函数,可以作为参数传递或赋值给变量。它们可以使用use关键字从外部作用域捕获变量。



$factor = 2;$double = function(int $value) use ($factor): int {    return $value * $factor;};

echo $double(5); // 10

自PHP 7.4起,出现了箭头函数——一种更简洁的用于单行闭包的语法。它们会自动从作用域中捕获变量。



$factor = 2;$double = fn(int $value): int => $value * $factor;

echo $double(5); // 10

使用时机: 箭头函数非常适合简单的转换(例如在array_map中),而经典闭包更适合包含多条语句的复杂逻辑。



3. 高阶函数:map、filter、reduce

在PHP中,使用内置函数以函数式风格处理数组:

  • array_map() — 对数组的每个元素应用一个函数。
  • array_filter() — 根据条件过滤数组。
  • array_reduce() — 将数组缩减为单个值。


$numbers = [1, 2, 3, 4, 5, 6];

// map: double each element$doubled = array_map(fn($n) => $n * 2, $numbers);print_r($doubled); // [2, 4, 6, 8, 10, 12]

// filter: keep only even numbers$even = array_filter($numbers, fn($n) => $n % 2 === 0);print_r(array_values($even)); // [2, 4, 6]

// reduce: sum of all elements$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);echo $sum; // 21

提示: 在array_filter()之后使用array_values()重置数组键名,否则它们可能不是连续的。



这些函数允许您用声明式调用链替代foreach循环,使代码更具可读性且不易出错。

博客

书籍推荐