手机版

浅谈PHP的匿名函数和闭包

时间:2021-08-27 来源:互联网 编辑:宝哥软件园 浏览:

总结

PHP 5.3.0中引入了闭包和匿名函数,非常有用,每个PHP开发人员都应该掌握。

匿名函数是没有名字的函数,可以像任何其他PHP函数对象一样分配给变量并传递。但是匿名函数还是函数,所以可以调用,也可以传入参数,适合函数或者方法的回调。

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

创建匿名函数

创建匿名函数很简单:

//给变量赋值匿名函数,调用$ greet=function(){以变量名()的形式返回‘hello world’;};echo $ greet();结果打印:

你好世界

匿名函数类似于普通的PHP函数:它们有相同的语法,接受参数和返回值。但是,闭包没有函数名。

注意:我们可以调用$greet变量,因为这个变量的值是一个闭包,闭包对象实现了__invoke()的神奇方法。只要变量名后面有(),PHP就会找到并调用__invoke方法。

我们通常使用匿名函数作为函数或方法的回调。事实上,很多PHP函数都使用匿名函数,比如array_map和preg_replace_callback。这是使用匿名PHP函数的绝佳机会。请记住,闭包和其他值一样,可以作为参数传递给其他PHP函数:

$numberPlusOne=array_map(函数($ number){ return $ number=1;}, [1, 2, 3]);print _ r($ numberPlusOne);在匿名函数出现之前,PHP开发人员只能单独创建命名函数,然后通过名称引用它们:

函数incrementNumber($ number){ return $ number=1;} $ number plusone=array _ map(' incrementNumber ',[1,2,3]);print _ r($ numberPlusOne);这样,回调被单独实现和使用,使用闭包的代码更加简洁。

创建闭包

包含自由变量的函数与为所有这些自由变量提供变量绑定的环境一起被称为闭包。

函数make hello world($ name){ $ I=0;return function()使用($name,$i){ echo $name。$ i. ' br$ I;};} $ hello 1=Makehelloworld(' it bsl ');$ hello 2=make hello world(' Kevin ');$ hello 1();$ hello 1();$ hello 1();$ hello 2();打印结果:

itbsl0 itbsl1 itbsl2 kevin0

从父范围继承变量

在PHP中,您必须手动调用闭包对象的bindTo方法,或者使用use关键字将父范围的变量和状态附加到PHP闭包。在实际应用中,使用关键字最多。

使用关键字

事实上,闭包在Laravel框架中也被广泛使用,其中最常见的是路由定义:

route :3360 group([' domain '=' { account } . myapp.com '],function(){ route 3360: get(' user/{ id } ',function ($account,$ id){//});});这两个函数是匿名函数。从父范围继承变量的使用场景在Laravel的底层源代码中也很丰富,比如Model.php的saveOrFail方法:

该方法的功能是使用事务将模型数据保存到数据库中。这样,我们使用匿名函数返回保存的状态,并使用use关键字将父范围的$options传递给闭包,以便它可以访问这些数据。

此外,它还支持将多个父范围变量传递给匿名函数,例如模型类中的forceFill方法:

多个变量可以用逗号分隔。

BindTo方法

正如我们前面提到的,闭包是一个对象,所以我们可以在闭包中使用关键字$this来获取闭包的内部状态。闭包对象的默认状态是无用的。需要注意的是__invoke的神奇方法和bindTo的方法。

__invoke的功能前面已经提到过了。当试图通过调用函数来调用对象时,将自动调用__invoke()方法。

接下来,让我们看看bindTo方法,通过它我们可以将闭包的内部状态绑定到其他对象。这里,bindTo方法的第二个参数特别重要,它的作用是指定绑定到闭包的对象所属的PHP类,这样闭包就可以在别处访问绑定到闭包的对象中的受保护和私有成员变量。

你会发现PHP框架经常使用bindTo方法将路由URL映射到匿名回调函数,框架会将匿名回调函数绑定到应用程序对象,这样重要的应用程序对象就可以被匿名函数中的关键字$this引用:

class App { protected $ routes=[];受保护$ responseStatus=' 200 OK受保护的$ responsecontentType=' text/html ';受保护的$响应正文=' Laravel College公共函数addRoute($routePath,$ route callback){ $ this-routes[$ route path]=$ route callback-bind to($ this,_ _ CLASS _ _);}公共函数dispatch($ current path){ foreach($ this-routes as $ route path=$ callback){ if($ route path==$ current path){ $ callback();} }标头(' HTTP/1.1 '。$ this-responseStatus);标题('内容类型: '。$ this-responseContentType);标题('内容-长度: '。MB _ strlen($ this-response body));echo $ this-response body;}}这里,我们需要重点介绍一下addRoute方法。这个方法的参数是一个路由路径和一个路由回调,dispatch方法的参数是当前HTTP请求的路径,它将调用匹配的路由回调。9号线是重点。我们将路由回调绑定到当前的应用实例。这样做可以在回调函数中处理应用程序实例的状态:

$app=新App();$app-addRoute('user/nonfu ',function(){ $ this-responsecontentType=' application/JSON;charset=utf8 ';$ this-response body=' { " name " : " LaravelAcademy ' } ';});$ app-dispatch(‘用户/非用户’);在幼虫的底部,也使用了绑定方法。有关详细信息,请参考照明\支持\特征\宏表的__call方法。以上是边肖介绍的PHP匿名函数和闭包的详细集成,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:浅谈PHP的匿名函数和闭包是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐