当前位置:首页 > PHP

php 管道实现

2026-02-14 11:42:07PHP

PHP 管道模式实现

管道模式(Pipeline Pattern)是一种将任务分解为多个步骤的设计模式,每个步骤由独立的处理单元完成,数据通过管道依次传递。以下是 PHP 中实现管道模式的几种方法:

使用闭包和数组迭代

通过闭包和 array_reduce 实现管道串联:

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

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

面向对象的管道类

封装管道操作为独立类,支持动态添加处理阶段:

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
        );
    }
}

// 使用示例
$result = (new Pipeline())
    ->add(function ($x) { return $x * 2; })
    ->add(function ($x) { return $x + 1; })
    ->process(5); // 输出: 11

Laravel 风格的管道实现

参考 Laravel 的管道设计,支持方法链和异常处理:

class LaravelPipeline
{
    protected $passable;
    protected $pipes = [];

    public function send($passable): self
    {
        $this->passable = $passable;
        return $this;
    }

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

    public function then(callable $destination)
    {
        $pipeline = array_reduce(
            array_reverse($this->pipes),
            $this->carry(),
            function ($passable) use ($destination) {
                return $destination($passable);
            }
        );
        return $pipeline($this->passable);
    }

    protected function carry(): callable
    {
        return function ($stack, $pipe) {
            return function ($passable) use ($stack, $pipe) {
                return $pipe($passable, $stack);
            };
        };
    }
}

// 使用示例
$result = (new LaravelPipeline())
    ->send(10)
    ->through([
        function ($x, $next) { return $next($x + 5); },
        function ($x, $next) { return $next($x * 2); }
    ])
    ->then(function ($x) { return $x; }); // 输出: 30

中间件模式扩展

适用于 HTTP 中间件场景的变体实现:

php 管道实现

interface Middleware
{
    public function handle($request, callable $next);
}

class PipelineWithMiddleware
{
    private $middlewares = [];

    public function pipe(Middleware $middleware): self
    {
        $this->middlewares[] = $middleware;
        return $this;
    }

    public function run($request)
    {
        $handler = array_reduce(
            array_reverse($this->middlewares),
            function ($next, $middleware) {
                return function ($request) use ($middleware, $next) {
                    return $middleware->handle($request, $next);
                };
            },
            function ($request) { return $request; }
        );
        return $handler($request);
    }
}

关键实现要点

  • 可组合性:每个处理阶段应为独立的可调用单元
  • 类型安全:建议使用接口约束管道阶段(如 Middleware
  • 异常处理:可在管道类中添加 try-catch 逻辑统一处理错误
  • 性能优化:对于大型管道,可考虑生成静态调用栈减少动态调用开销

实际应用中可根据需求选择简单闭包组合或完整的面向对象实现。

标签: 管道php
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class…

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…