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 相关文章推荐
mysql 的 like 问题,超强毕杀记!!!
Jan 18 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
Smarty中调用FCKeditor的方法
Oct 27 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
Laravel框架查询构造器简单示例
May 08 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
php文件包含的几种方式总结
2019/09/19 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
Python 深入理解yield
2008/09/06 Python
python根据京东商品url获取产品价格
2015/08/09 Python
python实现用户登录系统
2016/05/21 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
关于Tensorflow中的tf.train.batch函数的使用
2018/04/24 Python
django加载本地html的方法
2018/05/27 Python
python读取Kafka实例
2019/12/23 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
python支持多继承吗
2020/06/19 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
庆元旦广播稿
2014/02/10 职场文书
假释思想汇报范文
2014/10/11 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
教师节主题班会方案
2015/08/17 职场文书
浅谈CSS不规则边框的生成方案
2021/05/25 HTML / CSS
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android