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 相关文章推荐
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
Mar 26 PHP
php截取后台登陆密码的代码
May 05 PHP
自定义php类(查找/修改)xml文档
Mar 26 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
php实现Mysql简易操作类
Oct 11 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 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使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
javascript读取xml实现javascript分页
2013/12/13 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
浅析python内置模块collections
2019/11/15 Python
Django框架反向解析操作详解
2019/11/28 Python
python爬虫添加请求头代码实例
2019/12/28 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
应用数学自荐书范文
2013/11/24 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
商场端午节活动方案
2014/01/29 职场文书
2014年冬季防火方案
2014/05/21 职场文书
精神文明建设标语
2014/06/16 职场文书
施工安全汇报材料
2014/08/17 职场文书
爱护公物主题班会
2015/08/17 职场文书
执行力心得体会范文
2016/01/11 职场文书
商业计划书格式、范文
2019/03/21 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
学习nginx基础知识
2021/09/04 Servers
Python中的变量与常量
2021/11/11 Python
JavaScript流程控制(分支)
2021/12/06 Javascript