• 全都有综合资源网

    分享赚钱

    一个专业的免费资源网

    每天更新100+优质资源

  • 手机版二维码

    随时手机查素材

  • 扫描二维码

    加入官方微信群

PHP5.3引入闭包(Closure)function() use(){}的一种方法

技术文章 每日更新
2024-6-8 10:02 70人浏览 0人回复
原作者: 全都有综合资源网 来自: 全都有综合资源网 收藏 分享 邀请
摘要

今天看到这个“function() use(){}”函数的时候,很疑惑。第一次看到这种用法(我是新手)。 在segmentfault找到了一个答案,原来这是php5.3引入闭包的一种特殊用法,use意思是连接闭包和外界环境变量。 PHP闭包(Clos ...

  PHP5.3引入闭包(Closure)function() use(){}的一种方式6780 作者:全都有综合资本网 来历:全都有综合资本网 公布时候:2024-6-8 10:02

明天看到这个“function() use(){}”函数的时辰,很迷惑。第一次看到这类用法(我是新手)。

在segmentfault找到了一个答案,本来这是php5.3引入闭包的一种特别用法,use意义是毗连闭包和外界情况变量。
PHP闭包(Closure)function() use(){}的利用方式
匿名函数
当斟酌闭包时,必须斟酌匿名函数,也称为闭包,这似乎是 PHP 中实现闭包的首要方式。声明一个匿名函数以下:

layui-box layui-code-view" style="margin-top: 0px; margin-bottom: 5px; padding: 15px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); white-space: pre-wrap; overflow-wrap: break-word; box-sizing: inherit; position: relative; font-size: 15px; border: 1px solid rgb(209, 209, 209); background-color: rgb(255, 255, 255); color: rgb(68, 68, 68); font-family: inherit; outline: 0px; vertical-align: baseline; line-height: 28.5px; max-width: 100%; overflow: auto; word-break: break-all;">

code

  1. $func = function() {
  2. }; //带竣事符

可以看到,匿名函数由于没著名字,假如要利用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,挪用方式也不异:

code

  1. $func = function( $param ) {
  2.  echo $param;
  3. };
  4. $func( 'some string' );
  5. //输出:
  6. //some string

顺便提一下,PHP在引入闭包之前,也有一个可以建立匿名函数的函数:create function,可是代码逻辑只能写成字符串,这样看起来很艰涩而且欠好保护,所以很少有人用。

实现闭包

将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。

下边有三个例子:

code

  1. //例一
  2. //在函数里界说一个匿名函数,而且挪用它
  3. function printStr() {
  4.  $func = function( $str ) {
  5.  echo $str;
  6.  };
  7.  $func( 'some string' );
  8. }
  9. printStr();
  10. //例二
  11. //在函数中把匿名函数返回,而且挪用它
  12. function getPrintStrFunc() {
  13.  $func = function( $str ) {
  14.  echo $str;
  15.  };
  16.  return $func;
  17. }
  18. $printStrFunc = getPrintStrFunc();
  19. $printStrFunc( 'some string' );
  20. //例三
  21. //把匿名函数当做参数传递,而且挪用它
  22. function callFunc( $func ) {
  23.  $func( 'some string' );
  24. }
  25. $printStrFunc = function( $str ) {
  26.  echo $str;
  27. };
  28. callFunc( $printStrFunc );
  29. //也可以间接将匿名函数停止传递。假如你领会js,这类写法能够会很熟悉
  30. callFunc( function( $str ) {
  31.  echo $str;
  32. } );

毗连闭包和外界变量的关键字:USE

闭包可以保存地点代码块高低文的一些变量和值。PHP在默许情况下,匿名函数不能挪用地点代码块的高低文变量,而需要经过利用use关键字。

换一个例子看看:

code

  1. function getMoney() {
  2.  $rmb = 1;
  3.  $dollar = 6;
  4.  $func = function() use ( $rmb ) {
  5.  echo $rmb;
  6.  echo $dollar;
  7.  };
  8.  $func();
  9. }
  10. getMoney();
  11. //输出:
  12. //1
  13. //报错,找不到dorllar变量
如您所见,dollar没有在use关键字中声明,而且没法在此匿名函数中获得,是以我们在开辟中应留意此题目。
有人能够想晓得能否可以在匿名函数中变动高低文变量,但我发现不能

code

  1. function getMoney() {
  2.  $rmb = 1;
  3.  $func = function() use ( $rmb ) {
  4.  echo $rmb;
  5.  //把$rmb的值加1
  6.  $rmb++;
  7.  };
  8.  $func();
  9.  echo $rmb;
  10. }
  11. getMoney();
  12. //输出:
  13. //1
  14. //1

啊,本来use所援用的也只不外是变量的一个副本而已。可是我想要完全援用变量,而不是复制。

要到达这类结果,实在在变量前加一个 & 标记便可以了:

code

  1. function getMoney() {
  2.  $rmb = 1;
  3.  $func = function() use ( &$rmb ) {
  4.  echo $rmb;
  5.  //把$rmb的值加1
  6.  $rmb++;
  7.  };
  8.  $func();
  9.  echo $rmb;
  10. }
  11. getMoney();
  12. //输出:
  13. //1
  14. //2

好,这样匿名函数便可以援用高低文的变量了。假如将匿名函数返回给外界,匿名函数会保存use所援用的变量,而外界则不能获得这些变量,这样构成‘闭包’这个概念能够会更清楚一些。

按照描写改变一下上面的例子:

code

  1. function getMoneyFunc() {
  2.  $rmb = 1;
  3.  $func = function() use ( &$rmb ) {
  4.  echo $rmb;
  5.  //把$rmb的值加1
  6.  $rmb++;
  7.  };
  8.  return $func;
  9. }
  10. $getMoney = getMoneyFunc();
  11. $getMoney();
  12. $getMoney();
  13. $getMoney();
  14. //输出:
  15. //1
  16. //2
  17. //3

  总结

PHP闭包的特征并不太使人惊奇。究竟上,利用CLASS可以实现类似的甚至更强大的功用,更不用说js闭包了。我们只能期待PHP在未来改良其闭包支持。但是,匿名函数很是有用。例如,当利用preg_replace_callback等函数时,不必在内部声明回调函数。








©版权免责声明
1、本站所有资源均来自用户上传及互联网。 如有侵权,请联系站长!
2、分享目的仅供大家学习交流。 下载后必须在24小时内删除!
3、不得用于非法商业目的或违反国家法律。 否则,后果自负!
4、本站提供的源代码、模板、插件等资源不包含技术服务。 敬请谅解!
5.如果出现无法下载、无效或有广告的链接,请联系管理员寻求帮助!
6、本站资源价格仅用于赞助,所收取的费用仅用于维持本站日常运营!
7、如果遇到加密压缩包,请使用WINRAR解压。 如果遇到无法解压的加密压缩包,请联系管理员!
8、由于精力有限,很多源代码无法详细测试(解密),部分源代码无法区分为病毒或误报,所以没有进行修改。 请在使用前进行筛选。

路过

雷人

握手

鲜花

鸡蛋
热门教程
专业的免费源码资源分享平台
每天更新100+资源

招募版主发工资

  • 官方在线客服

    QQ客服:红颜

    点击交谈

    在线客服:良子

    点击交谈

    在线客服:闵月

    点击交谈
  • 上海市虹口区海伦中心B座4F4055-4056室

  • 手机扫码查看手机版

    手机查找资源更方便

  • 扫一扫关注官方微信公众号

    加入官方微信

一个专业的免费源码资源互联网分享平台 ©2001-2024 https://www.douyouvip.com全都有综合资源网( 豫ICP备2024057239号-1 )赞助会员|网站地图 HTML
全都有综合资源网,WordPress主题PHP源码,PHP网站源码,网站模板,软件源码,网站源码免费下载,免费网站源码,网站源码模板,免费网站源码下载,wp免费源码,wp免费主题下载,PHP企业网站源码,软件源码下载