• 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);
        }
    
    }
    
  • 相关阅读:
    Python校验文件MD5值
    no acceptable C compiler found in $PATH解决办法
    PRD是什么
    项目中PO、PM的职责区分
    vue-cli中打包之后css加载顺序有错
    vue-cli中打包图片路径错误
    vue2.0的父子组件数据传递
    vue中style的用法
    vue中class的用法
    angular淘宝购物车案例
  • 原文地址:https://www.cnblogs.com/canbefree/p/5242773.html
Copyright © 2020-2023  润新知