php之框架底层中间件模式开发实现、array_reduce的应用

众所周知php框架的中间件核心是通过array_reduce实现的

php之框架中间件模式开发实现、array_reduce的应用

1.先写个测试用例看一下函数的特性

php 复制代码
<?php
	function kernal($a,$b)
	{
		return $a . "  and  " . $b;
	}
	$array = [1,2,3];
	print_r(array_reduce($array, "kernal", "[Initial]")); 
	//[Initial]  and  1  and  2  and  3

?>

可以看出来,顺序是连贯的

参数传入是 initial,1,2,3

但是他并不是执行了多个auth函数,反而更像是字符串的连接方式

"inital"."1"."2"."3"把结果连成了一串

2.根据执行特性实现中间件

php 复制代码
<?php
	//一次请求方法,next相当于下一个中间件
	function baseMiddle($request,$next){
		$request .= "前置1";
		$res = $next($request);
		echo  "后置1"."\r\n";
		return $res;
	}
	function kernal($next,$handler)
	{
		return function ($request) use ($handler, $next) {
				echo "前置01|".$handler."\r\n";
				$res = $handler($request, $next);
				echo  "后置01|".$handler."\r\n";
				return $res;
            };
	}
	function middleClass1($request,$next){
		$request .= "前置2";
		$res = $next($request);
		echo   "后置2"."\r\n";
		return $res;
	}
	function middleClass2($request,$next){
		$request .= "前置3";
		$res = $next($request);
		echo   "后置3"."\r\n";
		return $res;
	}
	//这是一个存放中间件方法的数组
	$array = ["baseMiddle","middleClass1","middleClass2"];
	$handler = array_reduce(array_reverse($array), "kernal", function($response){ return $response;}); 
	$response = $handler("begin");
	var_dump($response);
	/**
	前置01|baseMiddle
	前置1
	前置01|middleClass1
	前置2
	前置01|middleClass2
	前置3
	后置3
	后置01|middleClass2
	后置2
	后置01|middleClass1
	后置1
	后置01|baseMiddle
	string(26) "begin前置1前置2前置3"
	**/
?>

根据输出结果我们可以看到代码的执行顺序,更好的了解array_reduce的特性

相关推荐
zz-zjx4 分钟前
Python实用转换模板
开发语言·前端·python
zuozong_7 分钟前
C++类与对象
开发语言·c++·算法
lfSeanDragon12 分钟前
数据结构-前缀树(Trie)
开发语言·c#
励志不掉头发的内向程序员16 分钟前
【LibreCAD 2D架构】从两个坐标到图形实体:RS_ActionDrawLine如何创建RS_Line
开发语言·c++·qt·学习·系统架构
Thomas214320 分钟前
scala 闭包
开发语言·后端·scala
sunshine22 girl26 分钟前
Java学习一 环境配置1 安装JDK,配置环境变量
java·开发语言·学习
似水এ᭄往昔31 分钟前
【Qt】--常用控件(按钮类控件)
开发语言·qt
范什么特西44 分钟前
一些常用名词
开发语言·前端·javascript
吴声子夜歌1 小时前
ApacheCommons——commons-configuration2(多数据源配置统一管理与热加载)
java·开发语言·算法·apache
乌夷1 小时前
JavaScript 的事件循环
开发语言·javascript·ecmascript