php 管道实现
PHP 管道实现方法
在 PHP 中,管道(Pipeline)模式通常用于将多个处理步骤串联起来,每个步骤处理数据后传递给下一个步骤。以下是几种实现方式:
使用闭包和数组 reduce 实现
通过闭包和 array_reduce 函数可以构建简单的管道:
$pipeline = array_reduce(
[
function ($x) { return $x * 2; },
function ($x) { return $x + 3; },
function ($x) { return $x / 5; }
],
function ($carry, $callback) {
return $callback($carry);
},
10 // 初始值
);
echo $pipeline; // 输出: 4.6
面向对象实现
创建一个管道类来管理各个处理阶段:
class Pipeline
{
private $stages = [];
public function add(callable $stage): self
{
$this->stages[] = $stage;
return $this;
}
public function process($payload)
{
return array_reduce(
$this->stages,
function ($carry, $stage) {
return $stage($carry);
},
$payload
);
}
}
// 使用示例
$pipeline = (new Pipeline)
->add(function ($x) { return $x * 2; })
->add(function ($x) { return $x + 3; })
->add(function ($x) { return $x / 5; });
echo $pipeline->process(10); // 输出: 4.6
使用生成器实现
对于大数据流处理,可以使用生成器:
function generatorPipeline($input)
{
yield from array_map(function ($x) { return $x * 2; }, $input);
yield from array_map(function ($x) { return $x + 3; }, $input);
yield from array_map(function ($x) { return $x / 5; }, $input);
}
foreach (generatorPipeline([10, 20, 30]) as $value) {
echo $value . "\n";
}
Laravel 风格的管道实现
Laravel 框架提供了更完善的管道实现:
function pipeline($passable, array $pipes)
{
return array_reduce(
array_reverse($pipes),
function ($carry, $pipe) {
return $pipe($carry);
},
$passable
);
}
$result = pipeline(10, [
function ($x) { return $x * 2; },
function ($x) { return $x + 3; },
function ($x) { return $x / 5; }
]);
应用场景
- 数据处理流水线:多个数据转换步骤的连续处理
- 中间件处理:HTTP 请求的中间件栈
- 业务逻辑链:订单处理等需要多步骤验证的场景
每种实现方式各有优劣,闭包方式简单但不易管理,面向对象方式更灵活但代码量稍多,可根据具体需求选择。







