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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
PHP中使用json数据格式定义字面量对象的方法
Aug 20 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
PHP概率计算函数汇总
Sep 13 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 PHP
实例分析PHP中PHPMailer发邮件
Dec 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
实用函数2
2007/11/08 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
php上传excel表格并获取数据
2017/04/27 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
Python装饰器用法与知识点小结
2020/03/09 Python
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
财政局长自荐信范文
2013/12/22 职场文书
淘宝店策划方案
2014/06/07 职场文书
庆元旦活动总结
2014/07/09 职场文书
2014年大学生工作总结
2014/11/20 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
公司业务员管理制度
2015/08/05 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL
python区块链实现简版工作量证明
2022/05/25 Python