zoukankan      html  css  js  c++  java
  • Closure

    加载中间件,注册回调事件。

    参考Larveal中间件加载方式
    具体代码如下:

    define("MALE",1);
    define("FEMALE",0);
    
    $request = new stdClass();
    $request->age = 9;
    $request->sex = MALE;
    $request->name = "小明";
    $request->info = "牛逼的人";
    
    
    //handle1,2,3,4是我要加入的注册事件,$request是原有请求
    function handle1(Closure $next){
        return function($request)use($next){
            if($request->age<10){
                echo "年龄小于10岁,不许坐车。",PHP_EOL;
            }
            return $next($request);
        };
    }
    function handle2(Closure $next){
        return function($request)use($next){
            return $next($request);
        };
    }
    function handle3(Closure $next){
        return function($request)use($next){
            return $next($request);
        };
    }
    function handle4(Closure $next){
        return function($request)use($next){
            return $next($request);
        };
    }
    
    function lastClosure(){
        return function($request){
            var_dump($request);
        };
    }
    
    //$p2 = call_user_func("handle1",lastClosure());
    //$p3 = call_user_func('handle2',$p2);
    //$p4= call_user_func('handle3',$p3);
    //$p5= call_user_func('handle4',$p4);
    //call_user_func($p5,$request);
    //die();
    
    $newPipe = new Pipe();
    Pipe::register("handle1");
    Pipe::register("handle2");
    Pipe::register("handle3");
    Pipe::register("handle4");
    $newPipe->run($request);
    
    class Pipe{
        private static $pipes;
        public function __construct(){
            self::$pipes = array();
        }
        public static function register($handle){
            self::$pipes[] = $handle;
        }
    
        //相当于 lastClosure()
        public function getFirstClosure(){
            return function($request){
                var_dump($request);
            };
        }
    
        public function getClosure(){
            return function($closure,$pipe){
                return function($request)use($closure,$pipe){
                    call_user_func(call_user_func($pipe,$closure),$request);
                };
            };
        }
    
        public function run($request){
            $firstClosure = $this->getFirstClosure();
            /**
             * 解释一下:
             * array_reduce(self::$pipes,$this->getClosure(),$firstClosure) 中间这个$this->getClosure()肯定是一个双重的closure.调用之后返回的还是一个Closure.
             */
            call_user_func(array_reduce(self::$pipes,$this->getClosure(),$firstClosure),$request);
        }
    
    }
    
  • 相关阅读:
    洛谷 AT2000 Leftmost Ball
    洛谷 P1326 足球
    洛谷 P4868 Preprefix sum
    洛谷 P2596 [ZJOI2006]书架
    HDU 3415 Max Sum of Max-K-sub-sequence
    洛谷 P3901 数列找不同
    洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…
    洛谷 P5749 [IOI2019]排列鞋子
    验证码解决表单重复的原理
    session和浏览器之间的技术内幕
  • 原文地址:https://www.cnblogs.com/canbefree/p/5242773.html
Copyright © 2011-2022 走看看