php的匿名函数和闭包函数

tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use


引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因为大家习惯上写了函数就是用来调用的,匿名函数和闭包函数做什么用的?

匿名函数

php官方解释如下:
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

这里说的很简单,可以用做回调函数,下面例子就是作为回调函数

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld
?>

上述例子中,preg_replace_callback 函数需要三个参数,第一个参数是一个正则表达式用来匹配数据,第二个参数是一个函数,第三个参数是需要匹配的字符串,也可以像下面这样写

<?php
$testFunc = function ($match) {return strtoupper($match[1]);};echo preg_replace_callback('~-([a-z])~', $testFunc, 'hello-world');
// 输出 helloWorld
?>

但是我们看到这个方法显然我们只需要用一次,所以没有必要再给他去命名,也没有多大的必要再去把他赋值给一个变量(赋值给变量的过程:PHP 会自动把此种表达式转换成内置类 Closure 的对象实例赋值给变量)

闭包函数

php中匿名函数也叫闭包函数,所以没什么区别。但是一般意义上的闭包的概念不是这样的,我们先说一下传统意义上的闭包,并提供一篇文章中js中的闭包用来和php中的闭包(匿名函数)进行对比。
学习Javascript闭包(Closure)---阮一峰

php中其实没有传统意义上的闭包函数,因为php中的函数不能调用夫作用域中的变量。如下

<?phpfunction a(){$a = 11;function b(){$b = 22;echo $a;echo $b;}b();}a();
//报Notice:Undefined variable: a in index.php on line 6
//22
?>

而看上面文章中得知,js中是可以的。所以php中匿名函数也叫闭包函数,也可以传递父作用域的变量进闭包函数(达到了类似js获取父作用域变量的效果),php中使用的是use关键字,具体如下

<?php
$count = 0;$a = function()
{ var_dump($count); };$b = function() use ($count)
{ var_dump($count); };$count++;$c = function() use (&$count)
{ var_dump($count); };$count++;$a();    // null   Notice: Undefined variable: count in
$b();    // int 0
$c();    // int 2
$count++;
$b();    // int 0?>

上述例子的输出和你认为的是不是不同呢。

解析:闭包函数(匿名函数)使用use获取函数定义时的副作用域变量,不管在何时调用。如果要获取调用时的变量值,需要用引用传递。具体怎么使用就要看什么使用场景了。

列举了几种常用的场景

  1. 作为回调函数
//一个我们使用过的例子
<?php/** 菜谱拆分食物后的拼接* 参数均不能为空* */public function mergeFoodsStr($str,array $mapping){
//        $str = '白菜半棵、__2__鲍菇两只、__0__一根,__1__两根,三者比例为100:100:15,酱油5克,香油2克,盐1克。';
//        $mapping = array(
//            0 =>array('name' => '胡萝卜','id' =>  '81' ),
//            1 =>array ( 'name' => '萝卜', 'id' =>  '72'),
//            2 =>array ( 'name' =>  '杏', 'id' => '1841')
//        );if(empty($str) || empty($mapping)){return false;}$strNew = preg_replace_callback('"|__(\d)__|" ',function ($matches) use ($mapping){return $mapping[$matches[1]]['name'];},$str);$this->log('拼接后的食材字符串',$strNew);return $strNew;}
?>

2.如果是一次性使用的函数,不能被重用,可以使用闭包函数

  1. 使用array_work()函数配合匿名函数来减少foreach层数
  2. 等等

希望大家多评论交流,互相学习

php的匿名函数和闭包函数相关推荐

  1. 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...

    1.有参函数:函数定义时,带有参数的函数 设置函数参数的默认值: (1)直接在函数定义位置的小括号内进行赋值 (2)低版本默认值的处理(在函数内部判断该参数是否有默认值,若没有,赋值初始值) 第1种默 ...

  2. PHP闭包函数与闭包函数回调

    PHP闭包函数与闭包函数回调 没有名的函数成为匿名函数 eg: $sum = function($num1,$num2){return $num1+$num2; }; //匿名函数调用 echo $s ...

  3. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  4. swift1.2语言函数和闭包函数介绍

    swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...

  5. ES6/04/严格模式,开启严格模式,严格模式与普通模式对比发生了那些变化,高阶函数,闭包函数,递归函数,递归实例(1,阶乘,2,斐波那契数列,3,根据id返回对应数据对象),浅拷贝和深拷贝

    函数 开启严格模式 1,用 " use strict"; 语句为整个脚本(即:script标签)开启严格模式;在<script>标记的第一行写上"use st ...

  6. 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)

    函数进阶 递归函数 回调函数 闭包函数 特点 匿名函数 lambda 表达式 迭代器 iter() next() 迭代器的取值方案 迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错 检测迭 ...

  7. python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...

    1 函数嵌套: 函数内可以调用了其他的函数. # def max2(x,y):# if x > y:# return x# else:# return y## def max3(x,y,z):# ...

  8. lua中的bind函数,闭包函数,终于知道有啥用处了

    -- 闭包绑定 function Bind(self, func, ...)assert(self == nil or type(self) == "table")assert(f ...

  9. python 函数进阶-闭包函数

    闭包函数 什么是闭包函数 如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数. # 外函数 outer def outer():# 外函数变量 numv ...

最新文章

  1. vue css 应用变量_如何使用CSS Grid和CSS变量快速为应用创建原型
  2. go语言中的float类型
  3. 查看服务器Smart Array卡
  4. android 处理通话焦点,java – AUDIOFOCUS_LOSS在Android中打电话后打电话
  5. .net中的socket异步通信实现--客户端代码
  6. NFS 服务器配置说明
  7. hash算法_数据库中间件分片算法之hash
  8. Linux 中su 与su - 的区别
  9. 数组的循环右移问题(好未来笔试题)
  10. Android架构师谈:View-Pager-性能优化之-无限循环
  11. hdfs中与file数组类似的数组_EXCEL中数组的应用专题之十二:行列数相同数组的运算...
  12. python基础代码大全-Python字典及基本操作(超级详细)
  13. BGP的同步规则分析
  14. 【实验五】利用三层交换机实现VLAN间路由
  15. spring boot 与配置
  16. cv python 读取灰度图
  17. VMware 15 安装 macOS High Sierra 10.13 图文教程
  18. PB控件属性之Tab
  19. php wordphp 读取图片,利用PHPWORD类替换word模版文字,图片等
  20. 联发科MT5597 4K数字电视芯片处理器介绍

热门文章

  1. TC配置文件WCMD.INI详解,只能在ini重修改的配置
  2. Global.asax详解
  3. OpenLayers 动态添加标记(Marker)和信息窗(Popup)
  4. 使用MySQL Proxy解决MySQL主从同步延迟
  5. 初次体验hiphop-php
  6. Joomla和Drupal简介
  7. Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
  8. 调试JDK源码-一步一步看HashMap怎么Hash和扩容
  9. 【Qt】在QtCreator中编译log4cplus
  10. 【EMC】EMC屏蔽设计