Jinyun's Notes

没什么天赋,爱好也不多,但愿坚持做些喜欢的事情

0%

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)
本笔记是笔者在学习和工作中的一些整理,如对您有用,请鼓励我继续写作