laravel 中间件原理分析
@中间件堆实现实例代码
废话不多说上代码
-
p,$next){
echo 1;
$p++;
p); },function(next){
echo 2;
$p++;
p); },function(next){
echo 3;
$p++;
p); }); p){};
$b = array_reduce ( v, KaTeX parse error: Expected '}', got 'EOF' at end of input: …eturn function(p) use(w){
if(!is_callable($v)){
$v = function(){};
}
p,$v);
}; } );$b(1);
分析下:
首先定义一个数组 数组里面是函数,函数接收2个参数。1个是要处理的参数,一个是下一个执行的函数,middleware 函数。
数组很简单不用太在意,关键在array_reduce函数,这个自己看下php手册。
用回调函数迭代地将数组简化为单一的值《http://www.php.net/manual/zh/function.array-reduce.php》重点在use 这个是闭包话拥有外部变量作用域的方法,这里就use(**v 参数这个是迭代值,是对象的不断嵌套 像一个麻袋一个 一个套一个,形成一个循环嵌套,最后array_reduce函数返回一个闭包的总入口 引入他人描述的图:
对不好理解看看数据打印结果图:
- [ ]
- 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)是一个对象,利用对象,利用闭包函数的特点(每次的循环调用是吧p比作request next就是下一个函数,是不是就是中间件的模型了。
第一次写语言表达不太好,看不董的留言一起分析