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开发者的10个技巧
Feb 25 PHP
PHP中遍历stdclass object的实现代码
Jun 09 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
windows下安装php的memcache模块的方法
Apr 07 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
PHP PDOStatement::getColumnMeta讲解
Feb 01 PHP
PHP封装的简单连接MongoDB类示例
Feb 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
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
yii操作cookie实例简介
2014/07/09 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
javascript 保存文件到本地实现方法
2012/11/29 Javascript
javascript 回调函数详解
2014/11/11 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
优秀员工自荐书
2013/12/19 职场文书
挂科检讨书范文
2014/02/20 职场文书
班级安全教育实施方案
2014/02/23 职场文书
大学军训感言200字
2014/02/26 职场文书
2014年药房工作总结
2014/11/22 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers