当前位置:首页 > PHP

php实现pipeline

2026-02-14 07:22:40PHP

PHP 实现 Pipeline 模式

Pipeline 模式是一种将任务分解为多个步骤并按顺序执行的架构模式。每个步骤处理输入并传递给下一个步骤。以下是 PHP 中实现 Pipeline 模式的几种方法。

基础实现:使用闭包和数组

通过闭包和数组构建一个简单的 Pipeline,逐步传递数据:

$pipeline = [
    function ($input) { return $input * 2; },
    function ($input) { return $input + 10; },
    function ($input) { return $input / 3; }
];

$result = array_reduce(
    $pipeline,
    function ($carry, $step) { return $step($carry); },
    5 // 初始值
);

echo $result; // 输出: (5 * 2 + 10) / 3 = 6.666...

面向对象实现:Pipeline 类

封装一个 Pipeline 类,支持动态添加步骤和链式调用:

class Pipeline
{
    private $steps = [];

    public function add(callable $step): self
    {
        $this->steps[] = $step;
        return $this;
    }

    public function execute($input)
    {
        return array_reduce(
            $this->steps,
            function ($carry, $step) { return $step($carry); },
            $input
        );
    }
}

// 使用示例
$pipeline = (new Pipeline())
    ->add(fn($x) => $x * 2)
    ->add(fn($x) => $x + 10)
    ->add(fn($x) => $x / 3);

echo $pipeline->execute(5); // 输出: 6.666...

中间件风格实现

结合中间件模式,支持步骤间更复杂的逻辑(如提前终止):

class MiddlewarePipeline
{
    private $steps = [];

    public function add(callable $step): self
    {
        $this->steps[] = $step;
        return $this;
    }

    public function execute($input)
    {
        $next = function ($input) { return $input; }; // 默认终止函数

        foreach (array_reverse($this->steps) as $step) {
            $next = function ($input) use ($step, $next) {
                return $step($input, $next);
            };
        }

        return $next($input);
    }
}

// 使用示例
$pipeline = (new MiddlewarePipeline())
    ->add(function ($input, $next) {
        if ($input > 100) return "Too large";
        return $next($input * 2);
    })
    ->add(function ($input, $next) {
        return $next($input + 10);
    });

echo $pipeline->execute(50); // 输出: 110
echo $pipeline->execute(200); // 输出: "Too large"

Laravel 风格的 Pipeline

参考 Laravel 框架的实现方式,支持依赖注入和更灵活的处理器:

php实现pipeline

class LaravelPipeline
{
    private $steps = [];
    private $container;

    public function __construct($container = null)
    {
        $this->container = $container;
    }

    public function through(array $steps): self
    {
        $this->steps = $steps;
        return $this;
    }

    public function execute($input)
    {
        return array_reduce(
            array_reverse($this->steps),
            $this->carry(),
            function ($input) { return $input; }
        )($input);
    }

    private function carry()
    {
        return function ($stack, $step) {
            return function ($input) use ($stack, $step) {
                if (is_callable($step)) {
                    return $step($input, $stack);
                } elseif (is_string($step) && $this->container) {
                    $step = $this->container->make($step);
                }
                return method_exists($step, 'handle')
                    ? $step->handle($input, $stack)
                    : $step($input, $stack);
            };
        };
    }
}

// 使用示例
$pipeline = (new LaravelPipeline())
    ->through([
        function ($input, $next) { return $next($input * 2); },
        function ($input, $next) { return $next($input + 10); },
    ]);

echo $pipeline->execute(5); // 输出: 20

关键点总结

  • 闭包链式调用:通过 array_reduce 实现步骤的连续执行
  • 中间件支持:允许步骤控制是否继续传递(如权限检查)
  • 依赖注入:可通过容器解析步骤的类实例
  • 类型灵活性:支持闭包、类名或对象作为处理步骤

根据项目复杂度选择合适实现,简单场景用基础版本,复杂需求可参考 Laravel 风格实现。

标签: phppipeline
分享给朋友:

相关文章

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL 路径…

php array实现

php array实现

PHP 数组实现 PHP 数组是一种灵活的数据结构,可以存储多个值。以下是几种常见的实现方式: 索引数组 索引数组使用数字作为键名,默认从0开始递增。 $fruits = array("Apple…

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n = c…

php实现抽奖程序

php实现抽奖程序

PHP实现抽奖程序 基本抽奖逻辑 创建一个简单的抽奖程序需要定义奖品、中奖概率及随机选择逻辑。以下是一个基础实现示例: <?php // 奖品配置(奖品名称 => 概率) $prizes…