PHP中的函数式编程:基础与示例

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

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

开始课程

PHP中的函数式编程:从理论到实践



PHP传统上与命令式和面向对象方法相关联,但现代语言为函数式编程(FP)提供了强大的工具。在本文中,我们将探讨如何在PHP中应用FP原则:从匿名函数到柯里化和不可变性。您将学习如何使代码更可预测、更可测试且更简洁。



1. 基础:匿名函数和闭包



匿名函数(lambda)是PHP中FP的基石。它们允许将行为作为数据进行传递。



<?php// Simple anonymous function$greet = function($name) {    return "Hello, $name!";};echo $greet('World'); // Hello, World!

// Usage with array_map$numbers = [1, 2, 3, 4, 5];$squared = array_map(function($n) { return $n * $n;}, $numbers);print_r($squared); // [1, 4, 9, 16, 25]?>


闭包是使用use关键字从外部作用域捕获变量的匿名函数:



<?php$factor = 3;$multiply = function($n) use ($factor) {    return $n * $factor;};echo $multiply(5); // 15

// Closure with a mutable variable (by reference)$counter = 0;$increment = function() use (&$counter) { $counter++;};$increment();echo $counter; // 1?>


闭包在创建回调函数和工厂时不可或缺。



2. 高阶函数:array_map、array_filter、array_reduce



PHP内置了经典的高阶函数,它们接受其他函数作为参数:



  • array_map — 转换数组的每个元素;
  • array_filter — 根据条件过滤元素;
  • array_reduce — 将数组缩减为单个值。


<?php$data = [1, 2, 3, 4, 5, 6];

// Filtering even numbers$even = array_filter($data, function($n) { return $n % 2 === 0;}); // [2, 4, 6]

// Doubling each element$doubled = array_map(function($n) { return $n * 2;}, $even); // [4, 8, 12]

// Sum of all values$sum = array_reduce($doubled, function($carry, $n) { return $carry + $n;}, 0); // 24?>


注意:array_filter会保留键。如果需要重新索引,请使用array_values()。



3. 不可变性与数据处理



函数式编程鼓励不可变性——数据不能被更改。不修改现有对象,而是创建新对象。



<?php// Imperative approach (mutation)$user = ['name' => 'Ivan', 'age' => 25];$user['age'] = 26; // modifies the original array

// Functional approach (immutable)$user = ['name' => 'Ivan', 'age' => 25];$updatedUser = array_merge($user, ['age' => 26]); // new array?>


对于数组操作,请使用array_merge、array_slice和spread运算符(PHP 7.4+):



<?php$original = [1, 2, 3];$new = [...$original, 4]; // [1, 2, 3, 4] — original remains unchanged?>


不可变性简化了调试并使代码线程安全。



4. 柯里化和部分应用



柯里化是将具有多个参数的函数转换为一系列具有单个参数的函数。部分应用是固定部分参数。



PHP没有内置的柯里化,但很容易实现:



<?php// Curried addition functionfunction curryAdd($a) {    return function($b) use ($a) {        return function($c) use ($a, $b) {            return $a + $b + $c;        };    };}

$add5 = curryAdd(5);

博客

书籍推荐