@中间件堆实现实例代码
废话不多说上代码
$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函数返回一个闭包的总入口 引入他人描述的图:

对不好理解看看数据打印结果图:
- 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 空间形成对象的循环嵌套)。形成循环嵌套麻袋模式。最后返回总入口。 把这里的变量 v放入下次对象的static空间形成对象的循环嵌套)。形成循环嵌套麻袋模式。最后返回总入口。把这里的变量p比作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));
第一次写语言表达不太好,看不董的留言一起分析