现在常用的框架都实现了中间件,那么中间件是如何实现的呢?这里的实现方式是通过闭包,当然也可以通过AST方式来实现,将源代码解析成AST树,在需要切入的地方插入代码,再还原成代码。这种实现方式过于复杂,一般只需要实现复杂的切入时才需要。classA{publicfunctionrun($a){echo"A:".$a;}}B类{publicfunctionrun($name,$handler){var_dump('B');$log=$handler($名称);var_dump('B-');返回$日志;}}classC{publicfunctionrun($name,$handler){var_dump('C');$日志=$处理程序($名称);var_dump('C-');返回$日志;}}$aa=function($a){return(newA)->run($a);};$stack[]=B::class;$stack[]=C::class;functionmiddleware($handler,$stack){foreach(array_reverse($stack)as$key=>$middleware){$log=function($handler)use($middleware){返回函数($name)use($handler,$middleware){$class=new$middleware();返回$class->run($name,$handler);};};$处理程序=$日志($处理程序);}返回n$handler;}$run=middleware($aa,$stack);$run('asd');执行以上代码,打印如下内容string(1)"B"string(1)"C"A:asdstring(2)"C-"string(2)"B-"
