美文网首页
PHP 闭包

PHP 闭包

作者: dongshixiao | 来源:发表于2018-03-24 09:11 被阅读0次

    闭包和匿名函数在php5.3中引入,闭包是指的创建时封装周围状态的函数,即便闭包所在的环境不存在了,闭包中封装的状态依然存在.匿名函数特别适合作为函数或方法回调.

    首先举一个创建闭包函数,并用use关键字来附加闭包的状态 的demo:

    function close($english_name)
    {
        return function ($real_name) use ($english_name) {
            return $english_name . ":" . $real_name;
        };
    }
    $close = close('season');//把字符串season封装在闭包中
    echo $close('董');//传入参数 调用闭包
    

    output:

    season:董
    

    首先调用close函数,需要一个$english_name的参数,这个函数返回了一个闭包对象,
    这个对象有一个bindTo()方法,和__invoke()的魔术方法.
    而且这个闭包封装了$english_name参数.即使跳出了close()函数的作用域,他还是会
    保存$english_name的值.(在类中以静态属性存放).

    下面的demo演示bindTo()方法的用法:

    class App{
        protected $routes = [];
        protected $responseStatus = '200 ok';
        protected $responseContentType = 'text/html';
        protected $responseBody = 'Hello World';
        public function addRoute($routePath,$routeCallback)
        {
            $this->routes[$routePath] = $routeCallback->bindTo($this,__CLASS__);
        }
        public function dispath($currentPath)
        {
            foreach ($this->routes as $routePath=>$callback){
                if ($routePath === $currentPath){
                    $callback();
                }
            }
    
            header('HTTP/1.1 '.$this->responseStatus);
            header('Content-type: '.$this->responseContentType);
            header('Content-length: '.mb_strlen($this->responseBody));
            echo $this->responseBody;
        }
    }
    

    调用

    $app = new  App();
    //每个闭包实例都可以使用$this关键字来获取闭包内部状态
    $app->addRoute('/user/season',function (){
        $this->responseContentType = 'application/json;charset=utf8';
        $this->responseBody = '{"name":"season"}';
    });
    
    $app->dispath('/user/season');
    

    注意addRoute()方法,这个方法的参数是一个路由路径和一个路由回调.
    dispath()方法的参数是当前http请求的路径,他调用匹配的路由回调.

    相关文章

      网友评论

          本文标题:PHP 闭包

          本文链接:https://www.haomeiwen.com/subject/kzqaqftx.html