目录

PHP 中的函数式编程

在最近的学习中,不断听到看到函数式编程,据说常见的编程范式有命令式编程、函数式编程、逻辑式编程等,而常见的面向对象编程居然是一种命令式编程。对于函数式编程来说,其只关心、定义输入数据和输出数据相关的关系,也就是映射。函数式编程关心数据的映射,命令式编程关心解决问题的步骤。

函数式编程概念

定义

函数式编程 - Functional Programming,一种编程范式,也就是如何编写程序的方法论。它属于『结构化编程』的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。

特性

  • 闭包和高阶函数。
  • 惰性计算。
  • 递归。
  • 函数是『第一等公民』:函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
  • 只用『表达式』,不用『语句』
  • 没有『副作用』:函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
  • 不修改状态:函数不维护任何状态,只返回新的值,不修改系统变量。
  • 引用透明性:如果提供同样的输入,那么函数总是返回同样的结果。

优点

  • 代码简洁,开发快速。
  • 接近自然语言,易于理解。
  • 更方便的代码管理。
  • 易于『并发编程』。
  • 代码的热升级。

函数式编程实例

实例一

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php

function map(callable $fn)
{
    return function ($args) use ($fn) {
        foreach ($args as $key => $val) {
            yield $key => $fn($val);
        }
    };
}

$a = function ($value) {
    return $value * 2;
};

$b = function ($value) {
    return ucwords($value);
};

$result1 = iterator_to_array(map($a)([1, 2, 3, 4]));
$result2 = iterator_to_array(map($b)(['php', 'java', 'python']));

var_dump($result1, $result2);

// 结果
array(4) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(6)
  [3]=>
  int(8)
}
array(3) {
  [0]=>
  string(3) "Php"
  [1]=>
  string(4) "Java"
  [2]=>
  string(6) "Python"
}

实例二

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php

function filter(callable $fn)
{
    return function ($args) use ($fn) {
        foreach ($args as $key => $val) {
            if ($fn($val)) {
                yield $key => $val;
            }
        }
    };
}

$a = function ($value) {
    return $value % 2 > 0;
};

$b = function ($value) {
    return ord($value) > 97;
};

$result1 = iterator_to_array(filter($a)([1, 2, 3, 4, 5]));
$result2 = iterator_to_array(filter($b)(['a', 'b', 'c', 'd', 'e']));

var_dump($result1, $result2);

// 结果
array(3) {
  [0]=>
  int(1)
  [2]=>
  int(3)
  [4]=>
  int(5)
}
array(4) {
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}

实例三

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

function reduce(callable $fn)
{
    return function ($args) use ($fn) {
        $accumulator = 0;
        foreach ($args as $value) {
            $accumulator = $fn($accumulator, $value);
        }

        return $accumulator;
    };
}

$a = function ($a, $b) {
    return $a + $b;
};

$b = function ($a, $b) {
    return sqrt($a) + sqrt($b);
};

$result1 = reduce($a)([1, 2, 3, 4, 5]);
$result2 = round(reduce($b)([1, 2, 3, 4, 5]), 2);

var_dump($result1, $result2);

// 结果
int(15)
float(4.19)