资讯专栏INFORMATION COLUMN

PHP|PHP实践-闭包

shenhualong / 3079人阅读

摘要:理论上,闭包和匿名函数是不同的概念。实际上,闭包和匿名函数是伪装成函数的对象。附加状态匿名函数不止可以当回调使用,还可以为附加并封装状态。这么做可以在这个匿名函数中使用关键字引用重要的应用对象。

闭包和匿名函数在PHP5.3.0中引入的。

闭包是指:创建时封装周围状态的函数。即使闭包所处的环境不存在了,闭包中封装的状态依然存在。

理论上,闭包和匿名函数是不同的概念。但是PHP将其视作相同概念。

实际上,闭包和匿名函数是伪装成函数的对象。他们是Closure类的实例。

闭包和字符串、整数一样,是一等值类型。

创建闭包

我们之所以能调用$closure变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()魔术方法。只要变量名后有(),PHP就会查找并调用__invoke()方法。

通常会把PHP闭包当作函数的回调使用。

array_map(), preg_replace_callback()方法都会用到回调函数,这是使用闭包的最佳时机!

举个例子:


得到结果:

[2, 3, 4]

在闭包出现之前,只能多带带创建具名函数,然后使用名称引用那个函数。这么做,代码执行会稍微慢点,而且把回调的实现和使用场景隔离了。


附加状态

匿名函数不止可以当回调使用,还可以为PHP附加并封装状态。

PHP中,必须手动调用闭包对象的bindTo()方法或者使用use关键字,才能把状态附加到PHP闭包上。


得到结果:

"Clay, get me sweet tea!"

PHP闭包是对象,每个闭包实例都可以使用$this关键字获取闭包的内部状态。闭包对象的默认状态没什么用,只有__invoke()方法和bindTo方法而已。

我们可以使用bindTo()这个方法,将Closure对象的内部状态绑定到其它对象上。

bindTo()方法的第二个参数:其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员。

PHP框架经常使用bindTo()方法把路由URL映射到匿名回调函数上。这么做可以在这个匿名函数中使用$this关键字引用重要的应用对象。

使用bindTo()方法附加闭包状态

routes[$routePath] = $routeCallback->bindTo($this, __CLASS__);
    }
    
    public function dispatch($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;
    }
}
addRoute("/user/nesfo", function () {
    $this->responseContentType = "application/json; charset=utf8";
    $this->responseBody = "{"name": "nesfo"}";
});
$app->dispatch("/user/nesfo");

参考

Modern PHP

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21648.html

相关文章

  • JavaScript深入之闭包

    摘要:深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。定义对闭包的定义为闭包是指那些能够访问自由变量的函数。 JavaScript深入系列第八篇,介绍理论上的闭包和实践上的闭包,以及从作用域链的角度解析经典的闭包题。 定义 MDN 对闭包的定义为: 闭包是指那些能够访问自由变量的函数。 那什么是自由变量呢? 自由变量是指在函数中使用的,但既不是函数参数也...

    caige 评论0 收藏0
  • 后端_PHP

    摘要:是超文本预处理语言一种开源的通用计算机语言是一门编写页面的语言,底层使用语言实现,使用的标签语法包裹代码。通常跑在服务端,与服务器配合工作,负责把加工完返回给访问者。 PHP PHP是超文本预处理语言,一种开源的通用计算机语言. PHP 是一门编写 web 页面的语言,底层使用 C 语言实现,使用 HTML 的标签语法包裹代码。PHP 通常跑在服务端,与 web 服务器配合工作,负责把...

    red_bricks 评论0 收藏0
  • 记一次 Laravel 应用性能调优经历

    摘要:为了一探究竟,于是开启了这次应用性能调优之旅。使用即时编译器和都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高或者更高的性能。 这是一份事后的总结。在经历了调优过程踩的很多坑之后,我们最终完善并实施了初步的性能测试方案,通过真实的测试数据归纳出了 Laravel 开发过程中的一些实践技巧。 0x00 源起 最近有同事反馈 Laravel 写的应用程序响应有点慢、20几个并...

    warkiz 评论0 收藏0
  • 分享一些简单的 Laravel 编码实践

    摘要:关于,它使用起来简单且舒适适用于编写产品代码,并能极大的推动开发过程。这里有一些在开发中值得记住的简单建议最大限度的使用你的文件不要破坏框架核心,不要编辑文件夹中的文件,你可以选择继承相关函数来实现。 showImg(https://segmentfault.com/img/remote/1460000018416776?w=808&h=449); 将任何 PHP 框架称为最好的框架都...

    cyixlq 评论0 收藏0
  • Laravel 编码实践分享

    摘要:关于,它使用起来简单且舒适适用于编写产品代码,并能极大的推动开发过程。中我最喜欢的一点是它是使用当下编程中的最佳实践所构建的。的工作原理是这样的,对于一个命名为的表,希望该表的模型被命名为。尽量为每一个请求创建。 showImg(https://segmentfault.com/img/remote/1460000018303541?w=808&h=449); 将任何 PHP 框架称为...

    wean 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<