PHP 匿名函数与注意事项详细介绍


Posted in PHP onNovember 26, 2016

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版本号
Oct 09 PHP
一些使用频率比较高的php函数
Oct 03 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
列举PHP的Yii 2框架的开发优势
Jul 03 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 PHP
PHP实现的登录,注册及密码修改功能分析
Nov 25 #PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 #PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 #PHP
Zend Framework上传文件重命名的实现方法
Nov 25 #PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 #PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 #PHP
php对接java现实加签验签的实例
Nov 25 #PHP
You might like
在PHP中使用灵巧的体系结构
2006/10/09 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
js 本地预览的简单实现方法
2014/02/18 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
python开启多个子进程并行运行的方法
2015/04/18 Python
简单介绍Python中利用生成器实现的并发编程
2015/05/04 Python
python实现excel读写数据
2021/03/02 Python
django session完成状态保持的方法
2018/11/27 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
.net软件工程师应聘上机试题
2015/03/10 面试题
食品委托检验协议书范本
2014/09/12 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
刑事法律意见书
2015/06/04 职场文书
销售人员管理制度
2015/08/06 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
Python机器学习之决策树和随机森林
2021/07/15 Javascript
 Python 中 logging 模块使用详情
2022/03/03 Python
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技