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 mysql索引问题
Jun 07 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
PHPLog php 程序调试追踪工具
Sep 09 PHP
简单的PHP留言本实例代码
May 09 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
PHP常用的缓存技术汇总
May 05 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
php类的定义与继承用法实例
Jul 07 PHP
php类自动加载器实现方法
Jul 28 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 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 神盾解密工具 ”
2014/06/20 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
JS实现淘宝幻灯片效果的实现方法
2013/03/22 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
经理秘书岗位职责
2013/11/14 职场文书
车间组长岗位职责
2013/12/20 职场文书
贷款担保书范文
2014/05/13 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
酒店厨房管理制度
2015/08/06 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书