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);
        }
    
    }
    
  • 相关阅读:
    神奇的HTML5画图应用
    Eclipse REST 库使用
    在应用中使用Ext Loader
    新浪微博XSS攻击事件
    数字图像处理空间变换
    安装制作不用愁—Wise installation入门教程
    ExtJS 4中自定义Grid列标题的对齐方式
    页面的兼容性从认识<!DOCTYPE>开始
    ExtJS 4.1有什么值得期待?
    ExtJS应用架构设计(二)
  • 原文地址:https://www.cnblogs.com/canbefree/p/5242773.html
Copyright © 2011-2022 走看看