laravel 中间件原理分析

@中间件堆实现实例代码

废话不多说上代码

$a  = array(function($p,$next){
       echo 1;
       $p++;
       $next($p); },function($p,$next){
       echo 2;
       $p++;
       $next($p); },function($p,$next){
       echo 3;
       $p++;
       $next($p); }); $v = function($p){
 $b  =  array_reduce ( $a ,  function($v, $w){
       return function($p) use($v,$w){
           if(!is_callable($v)){
               $v = function(){};
           }
           $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 参数这个是迭代值,是对象的不断嵌套 像一个麻袋一个 一个套一个,形成一个循环嵌套,最后array_reduce函数返回一个闭包的总入口 引入他人描述的图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190322160730817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x6eDI3NjY0Nzg=,size_16,color_FFFFFF,t_70)

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

  • 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)是一个对象,利用对象,利用闭包函数的特点(每次的循环调用是吧 v 放 入 下 次 对 象 的 s t a t i c 空 间 形 成 对 象 的 循 环 嵌 套 ) 。 形 成 循 环 嵌 套 麻 袋 模 式 。 最 后 返 回 总 入 口 。 把 这 里 的 变 量 v放入下次对象的static 空间形成对象的循环嵌套)。形成循环嵌套麻袋模式。最后返回总入口。 把这里的变量 vstaticp比作request next就是下一个函数,是不是就是中间件的模型了。
<?php 
function myfunction($default,$v2)
{
	return function ($index) use ($default,$v2){
		echo $v2.'---'.$index;
		$index ++ ;
		return $default($index);
	};
}
$a=array("Dog","Cat","Horse");
print_r(array_reduce($a,"myfunction",function($index){

})(1));

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值