PHP闭包函数详解


Posted in PHP onFebruary 13, 2016

匿名函数也叫闭包函数(closures允许创建一个没有指定没成的函数,最经常用作回调函数参数的值。

闭包函数没有函数名称,直接在function()传入变量即可 使用时将定义的变量当作函数来处理

$cl = function($name){
    return sprintf('hello %s',name);
  }
  echo $cli('fuck')`

直接通过定义为匿名函数的变量名称来调用

echo preg_replace_callback('~-([a-z])~', function ($match) {
  return strtoupper($match[1]);
}, 'hello-world');`

使用use

$message = 'hello';
$example = function() use ($message){
  var_dump($message);
};
echo $example();
//输出hello
$message = 'world';
//输出hello 因为继承变量的值的时候是函数定义的时候而不是 函数被调用的时候
echo $example();
//重置为hello
$message = 'hello';
//此处传引用
$example = function() use(&$message){
 var_dump($message);
};
echo $example();
//输出hello
$message = 'world';
echo $example();
//此处输出world
//闭包函数也用于正常的传值
$message = 'hello';
$example = function ($data) use ($message){
  return "{$data},{$message}";
};

echo $example('world');

example

class Cart{
  //在类里面定义常量用 const 关键字,而不是通常的 define() 函数。
  const PRICE_BUTTER = 1.00;
  const PRICE_MILK  = 3.00;
  const PRICE_EGGS  = 6.95;

  protected $products = [];
  public function add($product,$quantity){
    $this->products[$product] = $quantity;
  }
  public function getQuantity($product){
    //是否定义了
    return isset($this->products[$product])?$this->products[$product]:FALSE;
  }
  public function getTotal($tax){
    $total = 0.0;
    $callback = function($quantity,$product) use ($tax , &$total){
      //constant 返回常量的值
      //__class__返回类名
      $price = constant(__CLASS__."::PRICE_".strtoupper($product));

      $total += ($price * $quantity)*($tax+1.0);
    };
    //array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数
    array_walk($this->products,$callback);
    //回调匿名函数
    return round($total,2);

  }
}


$my_cart = new Cart();
$my_cart->add('butter',1);
$my_cart->add('milk',3);
$my_cart->add('eggs',6);


print($my_cart->getTotal(0.05));

以上就是关于PHP闭包函数的相关内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
用PHP和ACCESS写聊天室(四)
Oct 09 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
php 数组排序 array_multisort与uasort的区别
Mar 24 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
非常实用的PHP常用函数汇总
Dec 17 PHP
微信公众平台开发之天气预报功能
Aug 31 PHP
详解PHP序列化反序列化的方法
Oct 27 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
php设计模式之委托模式
Feb 13 #PHP
PHP常用设计模式之委托设计模式
Feb 13 #PHP
php判断邮箱地址是否存在的方法
Feb 13 #PHP
php打包网站并在线压缩为zip
Feb 13 #PHP
php session 写入数据库
Feb 13 #PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 #PHP
PHP信号量基本用法实例详解
Feb 12 #PHP
You might like
ThinkPHP之getField详解
2014/06/20 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
文本加密解密
2006/06/23 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
js实现交通灯效果
2017/01/13 Javascript
vue学习笔记之指令v-text && v-html && v-bind详解
2017/05/12 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
Python实现多属性排序的方法
2018/12/05 Python
python3安装speech语音模块的方法
2018/12/24 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python字符串及文本模式方法详解
2020/09/10 Python
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
在校生党员自我评价
2013/09/25 职场文书
高中生自我评价个人范文
2013/11/09 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
担保书格式
2015/01/20 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
与死神共舞观后感
2015/06/15 职场文书
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP