当前位置: 首页 > 后端技术 > PHP

PHP闭包新特性,匿名函数

时间:2023-03-29 21:15:48 PHP

闭包什么是闭包?1).PHP5.3引入了闭包和匿名函数。2).闭包指的是一个函数,它在函数创建时封装了函数周围的状态。即使闭包所在的环境不复存在,闭包封装的状态仍然存在。这与Javascript的闭包特性非常相似。3).匿名函数是没有名字的函数。匿名函数可以分配给变量并像任何其他PHP对象一样传递。匿名函数和闭包可以认为是同一个概念。4).需要注意的是,闭包使用的语法与普通函数相同,但它实际上是一个伪装成函数的对象,是Closure类的一个实例。闭包是一流的值类型,如字符串或整数。创建一个闭包$closure=function($name){returnsprintf('hello%s',$name);};echo$closure('Josh');我们之所以可以调用$closure变量是因为这个变量的值是一个闭包,而闭包对象实现了__invoke()这个魔术方法,只要后面跟着(),PHP就会去寻找__invoke()方法。下面是这个神奇方法的简要说明:classtestClass{publicfunction__invoke{print"helloworld";}}$n=newtestClass;$n();PHP从5.3版本开始新增了一个叫做__invoke()的Magic方法,使用这个方法可以在创建实例后直接调用对象。什么时候使用它?我们通常使用PHP闭包作为函数和方法的回调。许多PHP函数使用回调函数,例如array_map()和preg_replace_callback()。$numbersPlusOne=array_map(function($number){return$number+1;},[1,2,3]);如何理解附加状态?1).注意PHP闭包不会像JS一样自动封装应用程序的状态。在PHP中,必须调用闭包对象的bindTo方法或使用use关键字将状态附加到PHP闭包。让我们看一个例子};}//将字符串“Clay”封装在闭包中$clay=enclosePerson('Clay');//传入参数,调用闭包echo$clay('getmesweattea!');//Clay,给我来一杯汗茶!在这个例子中,函数enclosePerson()有一个$name参数,这个函数返回一个闭包对象,这个闭包封装了$name参数,即使返回的对象跳出了enclosePerson()函数的作用域,它将记住$name参数的值,因为$name变量仍在闭包内。2).使用use关键字将多个关键字传递到闭包中。这时,像PHP函数或方法的参数一样,使用逗号分隔多个参数。3).PHP闭包仍然是对象,您可以使用$this关键字来获取闭包的内部状态。闭包的默认状态有一个__invoke()魔术方法和一个bindTo()方法。4).bindTo()方法为闭包添加了一些有趣的东西。我们可以使用这个方法将Closure对象的内部状态绑定到其他对象。bindTo()方法的第二个参数可以指定绑定闭包的对象所属的PHP类,这样我们就可以访问这个类的protected和private成员变量。请参见以下代码示例:classApp{protected$route=array();受保护的$responseStatus='200OK';受保护的$responseContentType='text/html';受保护的$responseBody='Helloworld';publicfunctionaddRoute($routePath,$routeCallback){$this->routes[$routePath]=$routeCallback->bindTo($this,__CLASS__);}}publicfunctiondispatch($currentPath){foreach($this->routesas$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实例上,这样我们就可以在回调函数中使用它来处理App实例的状态。$app=newApp();$app->addRoute('/users/xiaoxiao',function(){$this->responseContentType='application/json;charset=utf8';$this->responseBody='{"姓名":"小小"}';});$app->dispatch('/users/xiaoxiao');专题系列PHP专题系列目录地址:https://github.com/xx19941215/webBlogPHP专题系列预计写两篇十篇左右,主要总结我们日常PHP开发中容易忽略的基础知识和规范方面的一些实用建议,现代PHP开发中的部署和优化,以及对Javascript语言特性的深入研究。