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

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

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

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

<?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
但是他并不是执行了多个kernal函数,反而更像是字符串的连接方式
“inital”.“1”.“2”."3"把结果连成了一串

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

<?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的特性
执行结果是对称的,就像被剥开的洋葱一样

相关推荐

  1. 理解Django中间及其应用实例

    2024-05-13 21:14:07       60 阅读
  2. Gin框架: 控制器, 中间分层设计案例

    2024-05-13 21:14:07       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 21:14:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 21:14:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 21:14:07       87 阅读
  4. Python语言-面向对象

    2024-05-13 21:14:07       96 阅读

热门阅读

  1. 代码随想录算法训练营第36期DAY23

    2024-05-13 21:14:07       26 阅读
  2. 接口安全设计之防篡改和防重放

    2024-05-13 21:14:07       32 阅读
  3. 后端返回文件流格式,前端vue 导出下载表格

    2024-05-13 21:14:07       36 阅读
  4. Harmony 添加library依赖库步骤

    2024-05-13 21:14:07       32 阅读
  5. Spring+Mybatis-plus 实现 Gauss DB数据库代码生成

    2024-05-13 21:14:07       28 阅读
  6. puppyteer

    2024-05-13 21:14:07       35 阅读
  7. 力扣:738. 单调递增的数字

    2024-05-13 21:14:07       39 阅读
  8. 访问者模式:设计模式中的动态行为扩展

    2024-05-13 21:14:07       42 阅读
  9. SQL简介

    2024-05-13 21:14:07       36 阅读
  10. vue 自定义事件和子组件方法调用

    2024-05-13 21:14:07       31 阅读