php的匿名函数和闭包函数
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获取函数定义时的副作用域变量,不管在何时调用。如果要获取调用时的变量值,需要用引用传递。具体怎么使用就要看什么使用场景了。
列举了几种常用的场景
- 作为回调函数
//一个我们使用过的例子
<?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.如果是一次性使用的函数,不能被重用,可以使用闭包函数
- 使用array_work()函数配合匿名函数来减少foreach层数
- 等等
希望大家多评论交流,互相学习
php的匿名函数和闭包函数相关推荐
- 函数类型:有参函数、无参函数、匿名函数、回调函数、立即执行函数、闭包函数、递归函数...
1.有参函数:函数定义时,带有参数的函数 设置函数参数的默认值: (1)直接在函数定义位置的小括号内进行赋值 (2)低版本默认值的处理(在函数内部判断该参数是否有默认值,若没有,赋值初始值) 第1种默 ...
- PHP闭包函数与闭包函数回调
PHP闭包函数与闭包函数回调 没有名的函数成为匿名函数 eg: $sum = function($num1,$num2){return $num1+$num2; }; //匿名函数调用 echo $s ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- swift1.2语言函数和闭包函数介绍
swift1.2语言函数和闭包函数介绍 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护. swift1.2语言函 ...
- ES6/04/严格模式,开启严格模式,严格模式与普通模式对比发生了那些变化,高阶函数,闭包函数,递归函数,递归实例(1,阶乘,2,斐波那契数列,3,根据id返回对应数据对象),浅拷贝和深拷贝
函数 开启严格模式 1,用 " use strict"; 语句为整个脚本(即:script标签)开启严格模式;在<script>标记的第一行写上"use st ...
- 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
函数进阶 递归函数 回调函数 闭包函数 特点 匿名函数 lambda 表达式 迭代器 iter() next() 迭代器的取值方案 迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错 检测迭 ...
- python 3.28 第三章 函数嵌套/名称空间//内置名称空间/全局名称空间/局部名称空间/作用域/函数对象/闭包函数。...
1 函数嵌套: 函数内可以调用了其他的函数. # def max2(x,y):# if x > y:# return x# else:# return y## def max3(x,y,z):# ...
- lua中的bind函数,闭包函数,终于知道有啥用处了
-- 闭包绑定 function Bind(self, func, ...)assert(self == nil or type(self) == "table")assert(f ...
- python 函数进阶-闭包函数
闭包函数 什么是闭包函数 如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数. # 外函数 outer def outer():# 外函数变量 numv ...
最新文章
- vue css 应用变量_如何使用CSS Grid和CSS变量快速为应用创建原型
- go语言中的float类型
- 查看服务器Smart Array卡
- android 处理通话焦点,java – AUDIOFOCUS_LOSS在Android中打电话后打电话
- .net中的socket异步通信实现--客户端代码
- NFS 服务器配置说明
- hash算法_数据库中间件分片算法之hash
- Linux 中su 与su - 的区别
- 数组的循环右移问题(好未来笔试题)
- Android架构师谈:View-Pager-性能优化之-无限循环
- hdfs中与file数组类似的数组_EXCEL中数组的应用专题之十二:行列数相同数组的运算...
- python基础代码大全-Python字典及基本操作(超级详细)
- BGP的同步规则分析
- 【实验五】利用三层交换机实现VLAN间路由
- spring boot 与配置
- cv python 读取灰度图
- VMware 15 安装 macOS High Sierra 10.13 图文教程
- PB控件属性之Tab
- php wordphp 读取图片,利用PHPWORD类替换word模版文字,图片等
- 联发科MT5597 4K数字电视芯片处理器介绍