如今经常使用框架都有实现中间件,那么中间件是如何实现的呢?php
这里实现的方法是经过闭包,固然也能够经过AST方法实现,将源码解析为AST树,在须要切入的地方插入代码,而后还原为代码,这种实现方法过于复杂,通常只有须要实现复杂的切入时才须要。shell
class A{ public function run($a){ echo "A:".$a; } } class B{ public function run($name,$handler){ var_dump('B'); $log= $handler($name); var_dump('B-'); return $log; } } class C{ public function run($name,$handler){ var_dump('C'); $log= $handler($name); var_dump('C-'); return $log; } } $aa = function($a){ return (new A)->run($a); }; $stack[]=B::class; $stack[]=C::class; function middleware($handler, $stack) { foreach (array_reverse($stack) as $key => $middleware) { $log = function($handler) use($middleware){ return function($name) use ($handler,$middleware) { $class = new $middleware(); return $class->run($name,$handler); }; }; $handler=$log($handler); } return $handler; } $run = middleware($aa,$stack); $run('asd');
执行上述代码,打印以下内容闭包
string(1) "B" string(1) "C" A:asdstring(2) "C-" string(2) "B-"