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中的函数不能调用夫作用域中的变量。如下

<?php
function 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.如果是一次性使用的函数,不能被重用,可以使用闭包函数

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

4. 等等

php的匿名函数和闭包函数的更多相关文章

  1. Golang函数-匿名函数与闭包函数

    Golang函数-匿名函数与闭包函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

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

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

  3. python函数之闭包函数与无参装饰器

    一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...

  4. php函数总结(闭包函数,匿名函数)

    php函数总结 1.普通函数 2.变量函数 function myfun($a) { echo $a; } $b = "myfun"; $b("test"); ...

  5. php匿名函数和闭包函数及use关键字传参及Closure匿名函数类

    php闭包函数用use传参有什么意义?答:use引用外层变量,比如全局变量 Closure,匿名函数,是php5.3的时候引入的,又称为Anonymous functions.字面意思也就是没有定义名 ...

  6. php匿名函数与闭包函数

    匿名函数:没有名字的函数:并没有牵扯到应用其他函数的变量问题.仅仅是没有名字 $f=function($param){} 闭包:A函数中嵌套着B函数,B程序中有用到A的变量,当外部函数C调用函数A时, ...

  7. Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...

  8. 箭头函数,闭包函数中的this指向

    在javscript中,this 是在函数运行时自动生成的一个内部指针,它指向函数的调用者. 箭头函数有些不同,它的this是继承而来, 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象. ...

  9. 小甲鱼零基础python课后题 P21 020函数:内嵌函数和闭包函数

    测试题 0.如果希望在函数中修改全局变量的值,应该使用什么关键字? 答:globe 1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字? 答:nonlocal 2.pyth ...

随机推荐

  1. HDFS 操作命令总结

    1 hadoop fs   这个是FS  shell 提供的 .上传下载文件  查看文件大小 改变文件权限都用这个命令. 具体命令的 用法可以到这个文档来查询 http://hadoop.apache ...

  2. Linux安装redis和部署

    第一步:下载安装包 访问https://redis.io/download  到官网进行下载.这里下载最新的4.0版本. 第二步:安装 1.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压 ...

  3. cf113D. Museum(期望 高斯消元)

    题意 题目链接 Sol 设\(f[i][j]\)表示Petya在\(i\),\(Vasya\)在\(j\)的概率,我们要求的是\(f[i][i]\) 直接列方程高斯消元即可,由于每个状态有两维,因此时 ...

  4. 【代码笔记】iOS-自定义选择框(高底强弱)

    一,效果图 二,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewControl ...

  5. css改变input显示的样式

    设置input宽高,边框大小颜色,背景颜色,字体颜色,字体大小,背景图片,去除蓝色边框. input{width:80px ;height:30px;border:1px solid red;colo ...

  6. React之小知识点总结

    总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值 ...

  7. IT的2017,面临数字生态系统新挑战,该怎么办?

    所谓数字生态系统,就是包含一系列基于标准,规模可变的硬件.软件.数字设备和服务,可系统地实现企业信息数字化,数据流通,以帮助企业提高运营效率. 随着越来越多的中国企业加入数字生态系统,中国CIO在技术 ...

  8. java 性能优化 字符串过滤实战

    转自[http://www.apkbus.com/blog-822717-78335.html]  如有不妥联系删除!! ★一个简单的需求 首先描述一下需求:给定一个 String 对象,过滤掉除了数 ...

  9. Android解析WindowManager(一)WindowManager体系

    前言 WindowManagerService(WMS)和AMS一样,都是Android开发需要掌握的知识点,同样的,WMS也很复杂,需要多篇文章来进行讲解,为何更好的理解WMS,首先要了解Windo ...

  10. [Android] 图片裁剪总结——自定义裁剪工具

    上次弄完调用系统裁剪之后,我又试着做一个自定义的裁剪工具. 原文地址请保留http://www.cnblogs.com/rossoneri/p/3988405.html 老习惯,文章开始前还是先把我参 ...