首页 > 其他分享 >array_reduce实现路由中间件

array_reduce实现路由中间件

时间:2024-09-23 16:45:38浏览次数:7  
标签:实现 reduce array 中间件 路由

<?php
interface Middleware
{
    public static function handle(Closure $next);
}

class Middleware1 implements Middleware
{
    public static function handle(Closure $next)
    {
        echo "Middleware1 before\n";
        $next();
        echo "Middleware1 after\n";
    }
}

class Middleware2 implements Middleware
{
    public static function handle(Closure $next)
    {
        echo "Middleware2 before\n";
        $next();
        echo "Middleware2 after\n";
    }
}

class Middleware3 implements Middleware
{
    public static function handle(Closure $next)
    {
        echo "Middleware3 before\n";
        $next();
        echo "Middleware3 after\n";
    }
}

function getSlice() // 返回一个函数,与上文的f一致
{
    return function ($stack, $pipe) {
        return function () use ($stack, $pipe) {
            return $pipe::handle($stack);
        };
    };
}

function then()
{
    $pipes = [
        "Middleware1",
        "Middleware2",
        "Middleware3",
    ];

    $firstSlice = function () { // 上文的目标函数 target
        echo "请求向路由器传递,返回响应.\n";
    };
    //嵌套闭包的解包方式是先从外到内,然后从内回归到外面,所以要根据注册顺序进行逆序
    $pipes = array_reverse($pipes);
    $closure = array_reduce($pipes, getSlice(), $firstSlice);
    var_dump($closure);//打印下该闭包
    // 因为最终返回了一个函数,所以需要call_user_func
    call_user_func(array_reduce($pipes, getSlice(), $firstSlice));
}
then();
echo "\n";
//array_reduce($pipes, getSlice(), $firstSlice),执行完成后相当于生成了f嵌套闭包
//function f()
//{
//    return Middleware1::handle(
//        function () {
//            return Middleware2::handle(
//                function () {
//                    return Middleware3::handle(function () {
//                        echo "请求向路由器传递,返回响应.\n";
//                    });
//                }
//            );
//        }
//    );
//}
//call_user_func('f');

标签:实现,reduce,array,中间件,路由
From: https://www.cnblogs.com/qcy-blog/p/18427317

相关文章

  • 为何我安装完提示这个报错?:Array and string offset access syntax with curly braces
    错误信息 Arrayandstringoffsetaccesssyntaxwithcurlybracesisdeprecated 表明你在使用的PHP版本较高,而你的程序代码中使用了一些在较新版本中已弃用的语法。具体来说,这是PHP7.4及以上版本对数组和字符串偏移量访问语法 {} 的弃用警告。解决方案1.降低PHP......
  • 全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、
    目录一、性能测试的指标1、并发量2、响应时间3、错误率4、吞吐量5、资源使用率二、压测全流程三、其他注意点1、并发和吞吐量的关系2、并发和线程的关系四、调优及分布式集群压测(待仔细学习)1.线程数量超过单机承载能力时的解决方案2.如何搭建分布式集群3.实施......
  • 常见中间件漏洞靶场(tomcat)
    1.CVE-2017-12615开启环境查看端口查看IP在哥斯拉里生成一个木马访问页面修改文件后缀和文件内容放包拿去连接2.后台弱⼝令部署war包打开环境将前边的1.jsp压缩成1.zip然后改名为1.war访问页面进行上传在拿去连接3.CVE-2020-1938打开环境访问一下来......
  • Mapreduce中的Mapper&reducer
      分布式文件系统中的mapreduce是Hadoop的基础数据存储方式。数据的存取在计算机中以以静态的状态存在。静态区和常量区以及本地方法栈和程序计数器都是高效的计算机内存。堆heap的设计实现是面向对象编程的数据体现模型。现代的分布式文件系统设计服务于J2EE的企业级版本是Ha......
  • 中间件的类型:不同的风格
    读完上一篇文章后,让我们看看expressjs中的中间件类型,中间件有不同的风格(?),每种都有独特的用途:1。应用级中间件:这就像主要成分。您将其添加到整个应用程序中,它会根据每个请求运行。?app.use((req,res,next)=>{console.log('thisrunsoneveryrequest!');next();});......
  • 【智能大数据分析 | 实验一】MapReduce实验:单词计数
    【作者主页】FrancekChen【专栏介绍】⌈⌈⌈智能大数据分析⌋......
  • 兼收并蓄 TypeScript - 进阶: ArrayBuffer
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-进阶:ArrayBuffer示例如下:advanced\arrayBuffer.ts{/***1、ArrayBuffer-内存之中的一段二进制数据,需要通过视图操作数据*2、TypedArray-视图,用于操作ArrayBuf......
  • 兼收并蓄 TypeScript - 基础: array
    源码https://github.com/webabcd/TypeScriptDemo作者webabcd兼收并蓄TypeScript-基础:array示例如下:basic\array.ts{//array-数组//创建数组letarray1:number[]=[1,2,3];letarray2:Array<number>=[1,2,3];letarray3:Ar......
  • Hadoop-MapReduce的 原理 | 块和片 | Shuffle 过程 | Combiner
    MapReduce的原理简单版本:AppMaster:整个Job任务的核心协调工具MapTask:主要用于Map任务的执行ReduceTask:主要用于Reduce任务的执行一个任务提交Job-->AppMaster(项目经理)-->根据切片的数量统计出需要多少个MapTask任务-->向ResourceManager(Yarn平台的老大)索要......
  • 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
    完美解决Array方法(map/filter/reduce)不按预期工作的正确解决方法,亲测有效!!!亲测有效完美解决Array方法(map/filter/reduce)不按预期工作的正确解决方法,亲测有效!!!报错问题可能出现的原因解决思路解决方法1.确保回调函数正确返回值2.检查数组的数据类型3.使......