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的特性

相关推荐
leaves falling4 小时前
C语言内存函数-
c语言·开发语言
至为芯5 小时前
IP6537至为芯支持双C口快充输出的45W降压SOC芯片
c语言·开发语言
小羊羊Python6 小时前
SoundMaze v1.0.1正式发布!
开发语言·c++
浩瀚地学6 小时前
【Java】JDK8的一些新特性
java·开发语言·经验分享·笔记·学习
l1t6 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
yugi9878387 小时前
基于遗传算法优化主动悬架模糊控制的Matlab实现
开发语言·matlab
moxiaoran57538 小时前
Go语言的错误处理
开发语言·后端·golang
shizhenshide8 小时前
社交媒体自动化:批量注册/发帖的验证码难题一站式解决
自动化·php·媒体·验证码·ezcaptcha
yugi9878388 小时前
MATLAB的多层感知器(MLP)与极限学习机(ELM)实现
开发语言·matlab
Never_Satisfied9 小时前
C#获取汉字拼音字母方法总结
开发语言·c#