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伪静态页面函数附使用方法
Jun 20 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
php eval函数用法总结
Oct 31 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
PHP扩展开发入门教程
Feb 26 PHP
PHP微信开发之二维码生成类
Jun 26 PHP
php轻松实现文件上传功能
Mar 03 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
PHP token验证生成原理实例分析
Jun 05 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
2019/04/23 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
Python中多线程及程序锁浅析
2015/01/21 Python
Python中表示字符串的三种方法
2017/09/06 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python简单过滤字母和数字的方法小结
2019/01/09 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python批量修改ssh密码的实现
2019/08/08 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
法定代表人授权委托书
2014/04/04 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书