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 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
php短域名转换为实际域名函数
Jan 17 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
php生成excel列序号代码实例
Dec 24 PHP
php实现简单的MVC框架实例
Sep 23 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 PHP
php实现每日签到功能
Nov 29 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
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python定位xpath 节点位置的方法
2019/08/27 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
Python实现分数序列求和
2020/02/25 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
解决jupyter notebook import error但是命令提示符import正常的问题
2020/04/15 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
小学优秀班集体申报材料
2014/05/25 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
银行资信证明
2015/06/17 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫