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 源代码压缩小工具
Dec 22 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
php制作的简单验证码识别代码
Jan 26 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 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
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
jQuery ajax cache缓存问题
2010/07/01 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
Angular模板表单校验方法详解
2017/08/11 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
keras多显卡训练方式
2020/06/10 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
python实现数字炸弹游戏程序
2020/07/17 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers
MySQL 数据 data 基本操作
2022/05/04 MySQL
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers