详解PHP匿名函数与注意事项


Posted in PHP onMarch 29, 2016

php5.3不但引进了匿名函数还有更多更好多新的特性了,下面我们一起来了解一下PHP匿名函数与注意事项,具体内容如下

PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束
PHP5.2:JSON 支持
PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar
PHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改
PHP5.5:yield, list() 用于 foreach, 细节修改
PHP5.6:常量增强,可变函数参数,命名空间增强

 现在基本上都使用PHP5.3以后的版本,但是感觉普遍一个现象就是很多新特性,过了这么长时间,还没有完全普及,在项目中很少用到。 

看看PHP匿名函数:

'test' => function(){
  return 'test'
},

PHP匿名函数的定义很简单,就是给一个变量赋值,只不过这个值是个function。

以上是使用Yii框架配置components文件,加了一个test的配置。

什么是PHP匿名函数?

看官方解释:

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

匿名函数示例

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

闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:

匿名函数变量赋值示例

<?php
$greet = function($name)
{
 printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');
?>

闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。

从父作用域继承变量

<?php
$message = 'hello'
// 没有 "use"
$example = function () {
 var_dump($message);
};
echo $example();
// 继承 $message
$example = function () use($message) {
 var_dump($message);
};
echo $example();
// Inherited variable's value is from when the function
// is defined, not when called
$message = 'world'echo $example();
// Reset message
$message = 'hello'
// Inherit by-reference
$example = function () use(&$message) {
 var_dump($message);
};
echo $example();
// The changed value in the parent scope
// is reflected inside the function call
$message = 'world'echo $example();
// Closures can also accept regular arguments
$example = function ($arg) use($message) {
 var_dump($arg . ' ' . $message);
};
$example("hello");
?>

php中的匿名函数的注意事项

在php5.3以后,php加入匿名函数的使用,今天在使用匿名的时候出现错误,不能想php函数那样声明和使用,详细看代码

$callback=function(){ 
 return "aa"; 
}; 
echo $callback();

打印出来是aa;

看下面的例子:

echo $callback(); 
$callback=function(){ 
 return "aa"; 
};

这时报错了!$callback为未声明,但是使用php自己声明的函数都不会报错的!

function callback(){ 
 return "aa"; 
} 
echo callback(); //aa 
 
echo callback(); //aa 
function callback(){ 
 return "aa"; 
}

这两个都打印出来aa;

在使用匿名函数的时候,匿名函数当做变量,须提前声明,js中也是这样的!!!!!

以上就是为大家介绍的PHP匿名函数与注意事项,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP中路径问题的解决方案
Oct 09 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
php ajax实现文件上传进度条
Mar 29 #PHP
php $_SESSION会员登录实例分享
Jan 19 #PHP
PHP实现163邮箱自动发送邮件
Mar 29 #PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 #PHP
PHP创建word文档的方法(平台无关)
Mar 29 #PHP
PHP中key和current,next的联合运用实例分析
Mar 29 #PHP
CodeIgniter基于Email类发邮件的方法
Mar 29 #PHP
You might like
Content-type 的说明
2006/10/09 PHP
php socket方式提交的post详解
2008/07/19 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python pandas模块基础学习详解
2019/07/03 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
上海中网科技笔试题
2012/02/19 面试题
公安学专业求职信
2014/07/27 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
六查六看自查报告
2014/10/14 职场文书
复活读书笔记
2015/06/29 职场文书
优秀志愿者感言
2015/08/01 职场文书
八年级数学教学反思
2016/02/17 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server