laravel 中间件原理分析

@中间件堆实现实例代码

废话不多说上代码

  • a=array(function(a = array(function(p,$next){
    echo 1;
    $p++;
    next(next(p); },function(p,p,next){
    echo 2;
    $p++;
    next(next(p); },function(p,p,next){
    echo 3;
    $p++;
    next(next(p); }); v=function(v = function(p){

    };

    $b = array_reduce ( a,function(a , function(v, KaTeX parse error: Expected '}', got 'EOF' at end of input: …eturn function(p) use(v,v,w){
    if(!is_callable($v)){
    $v = function(){};
    }
    w(w(p,$v);
    }; } );

    $b(1);
    分析下:
    首先定义一个数组 数组里面是函数,函数接收2个参数。1个是要处理的参数,一个是下一个执行的函数,middleware 函数。
    数组很简单不用太在意,关键在array_reduce函数,这个自己看下php手册。
    用回调函数迭代地将数组简化为单一的值《http://www.php.net/manual/zh/function.array-reduce.php》

    重点在use 这个是闭包话拥有外部变量作用域的方法,这里就use(**v)v**)重点这个v 参数这个是迭代值,是对象的不断嵌套 像一个麻袋一个 一个套一个,形成一个循环嵌套,最后array_reduce函数返回一个闭包的总入口 引入他人描述的图:
    laravel 中间件原理分析

对不好理解看看数据打印结果图:

  1. [ ]
  2. object(Closure)#7 (1) { [“static”]=> array(2) {
    [“v”]=>
    object(Closure)#6 (1) {
    [“static”]=>
    array(2) {
    [“v”]=>
    object(Closure)#5 (1) {
    [“static”]=>
    array(2) {
    [“v”]=>
    NULL
    [“w”]=>
    object(Closure)#1 (0) {
    }
    }
    }
    [“w”]=>
    object(Closure)#2 (0) {
    }
    }
    }
    [“w”]=>
    object(Closure)#3 (0) {
    } } }
    其他先忽律其他,重点看v=>static 这个数组下的变量 是不是一层嵌套一层, object(Closure)是一个对象,利用对象,利用闭包函数的特点(每次的循环调用是吧vstaticv放入下次对象的static 空间形成对象的循环嵌套)。形成循环嵌套麻袋模式。最后返回总入口。 把这里的变量p比作request next就是下一个函数,是不是就是中间件的模型了。

第一次写语言表达不太好,看不董的留言一起分析