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获取网卡地址的代码
Apr 09 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
php 文件上传实例代码
Apr 19 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
php比较多维数组中值的大小排序实现代码
Sep 08 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
phpinfo无法显示的原因及解决办法
Feb 15 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 源代码压缩小工具
2009/12/22 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
JS操作Cookies的小例子
2013/10/15 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
vue弹窗插件实战代码
2018/09/08 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
python实现html转ubb代码(html2ubb)
2014/07/03 Python
Python去除列表中重复元素的方法
2015/03/20 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Django与JS交互的示例代码
2017/08/23 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
Python中常用的内置方法
2019/01/28 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
python中property和setter装饰器用法
2019/12/19 Python
PyQt实现计数器的方法示例
2021/01/18 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
高校教师思想汇报
2014/01/11 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
复试通知单模板
2015/04/24 职场文书
创业计划书之甜品店
2019/09/18 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
MySQL窗口函数的具体使用
2021/11/17 MySQL