improved / 功能
函数处理和函数式编程
v1.0.0
2024-09-03 23:04 UTC
Requires
- php: >=8.1.0
Requires (Dev)
- phpstan/phpstan: ^1.12
- phpunit/phpunit: >= 10.5, < 12
- squizlabs/php_codesniffer: ^3.10
This package is auto-updated.
Last update: 2024-09-03 23:07:16 UTC
README
函数处理
用于函数处理和函数式编程的库。
安装
composer require improved/function
函数
function_pipe(callable ...$callables)
function_all(callable ...$callables)
function_trampoline(callable $callable)
function_pipe
callable function_pipe(callable ...$functions)
组合所有函数,将一个函数的输出作为另一个函数的输入。
每个可调用对象应只需要一个参数,如果需要,请使用短闭包 fn()
。
use Improved as i; $slugify = i\function_pipe( fn($str) => i\string_case_convert($str, i\STRING_LOWERCASE), 'Improved/string_remove_accents', 'trim', fn($str) => preg_replace('/\W+/', '-', $str) ); $slugify("Bonjour du monde / Français "); // "bonjour-du-monde-francais"
function_all
callable function_all(callable ...$functions)
顺序调用所有函数。参数传递给每个函数。第一个参数通常是累加器。
期望函数不返回任何内容(void)。如果返回任何内容,则会被忽略。
use Improved as i; $make = i\function_all( static function(ArrayObject $acc, array $opts): void { if (in_array('skip-prepare', $opts, true)) return; $acc[] = 'prepare'; }, new Compiler(), // Invokable object static function(ArrayObject $acc, array $opts): void { $acc[] = 'finish'; } ); $acc = new ArrayObject(); $opts = [/* ... */]; $make($acc, $opts);
function_trampoline
callable function_trampoline(callable $callable)
返回一个新函数,该函数使用尾递归优化装饰给定的函数。
在传统的递归中,典型的模型是首先执行递归调用,然后使用递归调用的返回值来计算结果。这样,直到从每个递归调用返回之前,你都无法得到计算的结果。
传统递归的问题在于它会构建一个调用栈,这限制了你可以允许的递归数量。
警告:未捕获错误:达到最大函数嵌套级别 '256',终止!
在 尾递归 中,你首先执行计算,然后执行递归调用,并将当前步骤的结果传递给下一个递归步骤。这导致最后一个语句的形式是 return recursive_function(params, accumulator)
。
结果是通过对累加器进行计算得到的,因此任何给定递归步骤的返回值与下一个递归调用的返回值相同。
$sum_of_range = i\function_trampoline(function ($from, $to, $acc = 0) use (&$sum_of_range) { if ($from > $to) { return $acc; } return $sum_of_range($from + 1, $to, $acc + $from); }); $sum_of_range(1, 10000); // 50005000;
尾递归优化可以自动检测这种模式并将其作为连续调用而不是嵌套调用应用。不幸的是,PHP 并未实现这一点,因此需要使用 trampoline 函数。
如果深度递归(10+级别),请使用 function_trampoline
。