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 Squid中可缓存的动态网页设计
Sep 17 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
php批量删除cookie的简单实现方法
Jan 26 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
curl 出现错误的调试方法(必看)
Feb 13 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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
提问的智慧
2006/10/09 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
jQuery焦点图插件SaySlide
2015/12/21 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
Vue内容分发slot(全面解析)
2017/08/19 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
使用cx_freeze把python打包exe示例
2014/01/24 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
python实现统计文本中单词出现的频率详解
2019/05/20 Python
Python实现微信机器人的方法
2019/09/06 Python
Python循环实现n的全排列功能
2019/09/16 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
Python计算IV值的示例讲解
2020/02/28 Python
Python中的流程控制详解
2021/02/18 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
银河香水:Galaxy Perfume
2019/03/25 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
JavaScript 反射学习技巧
2021/10/16 Javascript
vue使用element-ui按需引入
2022/05/20 Vue.js