PHP 闭包

2018-03-24  本文已影响0人  dongshixiao

闭包和匿名函数在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请求的路径,他调用匹配的路由回调.

上一篇下一篇

猜你喜欢

热点阅读