aviator/pipe

使用简单的包装类链式调用可调用函数。

0.0.1 2017-11-06 16:43 UTC

This package is auto-updated.

Last update: 2024-09-21 19:37:21 UTC


README

PHP代码可能会让人难以理解,尤其是在处理嵌套函数时。为什么不尝试链式调用这些函数呢?

$filter = function ($item) { return $item === 'SOME'; };

// Offputting one-liner
echo implode('.', array_filter(explode('-', strtoupper(trim('    some-value'))), $filter))

// Multiple assignments
$value = '    some-value';
$value = trim($value);
$value = strtoupper($value);
$value = explode('-', $value);
$value = array_filter($value, $filter);
echo implode('.', $value);

// Easy to read pipe
echo take('    some-value')
    ->trim()
    ->strtoupper()
    ->explode('-', '$$')
    ->array_filter($filter)
    ->implode('.', '$$')
    ->get();

// prints 'SOME'

安装

通过Composer

composer require aviator/pipe

测试

通过Composer

composer test

用法

获取一个Pipe对象

$value = new Pipe('value');
$value = Pipe::take('value');
$value = take('value');

然后你可以链式调用可调用函数

$value->pipe('strtoupper');

并获得修改后的值

echo $value->get();

// prints 'VALUE'

管道方法是可链式的

echo Pipe::take('    value')
    ->pipe('trim')
    ->pipe('strtoupper')
    ->get();
    
// prints 'VALUE'

Pipe使用一个神奇的__call将其他方法重定向到pipe方法,所以你根本不需要使用pipe(...)

echo Pipe::take('    value')
    ->trim()
    ->strtoupper()
    ->get();
    
// prints 'VALUE'

参数

你可以使用带有参数的可调用函数

echo Pipe::take('value')
    ->str_repeat(3)
    ->strtoupper()
    ->get();
    
// prints 'VALUEVALUEVALUE'

Pipe始终将你要修改的值(如上面的示例中的'value')作为第一个参数传递。

这通常有效,但由于PHP有一些独特的参数排序,有些情况下可能不适用。在这些情况下,你可以使用占位符,默认为$$,来表示要修改的值。

例如,implode()

echo Pipe::take(['some', 'array'])
    ->implode('.', '$$')
    ->get();
    
// prints 'some.array'

因为implode()将输入值作为其第二个参数,我们告诉Pipe将其放在哪里,使用'$'。然后在调用时值被交换。

闭包

你可以将任何可调用函数传递给管道,包括闭包

$closure = function ($item) { return $item . '-postfixed'; };

echo Pipe::take('value')
    ->pipe($closure)
    ->get();

// prints 'value-postfixed'

其他内容

许可证

此包在MIT许可证(MIT)下运行。有关更多信息,请参阅LICENSE

感谢

这主要基于Sebastiaan Luca的想法和他的Pipe\Item类。