apantle/fun-php

功能式编程,增强 OOP PHP 开发者体验

0.3 2019-09-03 23:21 UTC

This package is auto-updated.

Last update: 2024-09-03 03:16:28 UTC


README

功能式编程,增强 OOP PHP 开发者体验

Build Status Maintainability Test Coverage

这里有一些支持的函数及其最小示例,更多示例可以在包的测试中找到

compose

应用一系列函数,首先应用右侧的函数,然后应用返回值到左侧的函数

示例

$stringSquaredRoot = compose('strval', 'sqrt');

var_dump('4' === $stringSquaredRoot(16)); // bool(true) 

pipe

返回一个接收任意数量可调用函数的函数,第一个函数接收任意数量的参数,然后它将返回值传递到管道中的下一个函数,依此类推。下一个函数必须是单参数的(只接受一个参数)。

带有简化功能控制器的示例

$getFoldersController = pipe(
    'validateHasUser',
    'validatePermissionOfUser',
    'getRootFolders'
);

function validateHasUser($request = null)
{
    if (!array_key_exists($request, 'user')) {
        throw new \LogicException('User parameter not received');
    }
    return $request;
}

function validatePermissionOfUser($request)
{
    if (intval($request['user']) !== 1) {
        throw new \DomainException('Only root user has permissions on this route');
    }
    return $request;
}

function getRootFolders($request) {
    return [ 'folder-' . $request['user'] ];
}

// $user key absent of request:
$getFoldersController(['path' => 'whatever']); // throws LogicException

// $user key present, non root user
$getFoldersController(['user' => 20]); // throws DomainException

// $user is root
$getFoldersController(['user' => 1]); // returns [ 'folder-1' ];

curryToUnary

允许部分应用任何可调用函数,返回一个单参数函数。在结合 pipe 编写无参数风格算法时非常有用。

传入要绑定的参数列表,常量 Apantle\FunPHP\_ 可以交换期望的参数位置。例如,您可以使用 array_map 和要映射的数组构建一个 Mappable 集合,并每次传递不同的映射器。

示例

$simpleArrayReverse = curryToUnary('array_reverse');

var_dump([4,3,2,1] === $simpleArrayReverse([1,2,3,4]); // bool(true)

// custom position of argument to receive:
$map = curryToUnary('array_map', \Apantle\FunPHP\_, [1, 2, 3, 4]);

$result = $map(function ($num) { return $num * 10; });

var_dump([10, 20, 30, 40] === $result); // bool(true)

constant

返回一个总是返回传入值的函数,对于占位符或与常量值的组合非常有用,但可以避免硬编码值

$request = [
    'store_id' => filter_input(
        INPUT_POST,
        'store',
        VALIDATE_FILTER_INT
    ) 
];

$scope = constant($request['store_id']);
$scope() // always return the value received in $_POST['store']

identity

用于函子测试,总是返回传入的值

head

获取数组中的第一个元素

var_dump(1 === head[1,2,3,4]); // bool(true)

unfold

返回一个函数,它接受单个值,对其应用一个变换数组,并返回一个具有与规格数组相同键的关联数组,其值由这些函数映射。

用于将单个输入传递到多个服务,然后收集输出的单个 hashmap。是 apantle/hashmapper 的完美对偶。

示例

$input = 4;

var_dump(json_encode(unfold([
    'sqrt' => 'sqrt',
    'factorial' => 'gmp_fact'
])($input)));
// string(25) "{"sqrt":2,"factorial":24}"

如果函数是单参数的,则只传递输入值。

为了更容易地组合复杂的算法,映射器可以接收第二个参数,apantle/hashmapper 会自动将此参数传递给每个映射器,即整个要映射的关联数组。

除了变换规格之外,它还接受一个可选参数,允许您将值通过映射器传递,建议该参数是一个对象,以便通过引用传递。

有关更多示例,请参阅测试源代码 https://github.com/apantle/fun-php/blob/566bfe539bb193028c5bad4c6687a6f3a1b1e82c/tests/FunctionsTest.php#L50-L70