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 发送数据
Oct 09 PHP
转PHP手册及PHP编程标准
Dec 17 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
php中adodbzip类实例
Dec 08 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
php数组和链表的区别总结
Sep 20 PHP
深入分析PHP设计模式
Jun 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中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
原生js实现3D轮播图
2020/03/21 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
详解Python中time()方法的使用的教程
2015/05/22 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
Django单元测试工具test client使用详解
2019/08/02 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python 爬取疫情数据的源码
2020/02/09 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
会计应届生的自荐信
2013/12/13 职场文书
政府门卫岗位职责
2014/04/29 职场文书
竞聘自述材料
2014/08/25 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
JavaScript控制台的更多功能
2021/04/28 Javascript
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis