您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

php闭包有什么用?

时间:2019-10-11 10:27:27  来源:  作者:

php闭包是什么?有什么用?下面本篇文章就来给大家介绍一下php闭包。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

php闭包有什么用?

 

什么是php闭包?

PHP闭包实现主要就是靠匿名函数

将匿名函数在普通函数中当数传入,也可以被返回.这就实现了—个简单的闭包。

通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫闭包!

闭包的两个持点:

1、作为一个函 数变量的一个引用-当函数返回时,其处于激活状态. ?

2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区.

其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留。

php闭包有什么用?

实现php闭包既可以读取函数内部的变量,同时还可以将变量始终保存在内存中,使得即使函数执行完毕,变量也将一直存在。

闭包的几个作用:

1、减少foreach的循环的代码

比如手册http://php.net/manual/en/functions.anonymous.php 中的例子Cart

<?php

// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。

// 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。

class Cart

{

constPRICE_BUTTER = 1.00;

constPRICE_MILK = 3.00;

constPRICE_EGGS = 6.95;

protected $products = array();

publicfunction add($product,$quantity)

{

$this->products[$product] =$quantity;

}

publicfunction getQuantity($product)

{

returnisset($this->products[$product]) ?$this->products[$product] :

FALSE;

}

publicfunction getTotal($tax)

{

$total= 0.00;

$callback=

function($quantity,$product) use ($tax, &$total)

{

$pricePerItem= constant(__CLASS__. "::PRICE_" .

strtoupper($product));

$total+= ($pricePerItem* $quantity) * ($tax+ 1.0);

};

array_walk($this->products,$callback);

returnround($total, 2);;

}

}

$my_cart= new Cart;

// 往购物车里添加条目

$my_cart->add('butter', 1);

$my_cart->add('milk', 3);

$my_cart->add('eggs', 6);

// 打出出总价格,其中有 5% 的销售税.

print $my_cart->getTotal(0.05) . "n";

// The result is 54.29

?>

这里如果我们改造getTotal函数必然要使用到foreach

2、减少函数的参数

function html ($code , $id="",$class=""){

if ($id !== "") $id= " id = "$id"" ;

$class = ($class !== "")? " class ="$class"":">";

$open = "<$code$id$class";

$close = "</$code>";

return function ($inner= "")use ($open,$close){

return "$open$inner$close";};

}

如果是使用平时的方法,我们会把inner放到html函数参数中,这样不管是代码阅读还是使用都不如使用闭包

3、解除递归函数

<?php

$fib= function($n)use(&$fib) {

if($n== 0 || $n == 1) return 1;

return$fib($n- 1) + $fib($n- 2);

};

echo$fib(2) . "n";// 2

$lie= $fib;

$fib= function(){die('error');};//rewrite $fib variable

echo$lie(5); // error because $fib is referenced by closure

注意上题中的use使用了&,这里不使用&会出现错误n-1)是找不到function的(前面没有定义fib的类型)

所以想使用闭包解除循环函数的时候就需要使用

<?php

$recursive= function () use (&$recursive){

// The function is now available as $recursive

}

这样的形式

4、关于延迟绑定

如果你需要延迟绑定use里面的变量,你就需要使用引用,否则在定义的时候就会做一份拷贝放到use中

<?php

$result = 0;

$one = function()

{ var_dump($result); };

$two = function() use ($result)

{ var_dump($result); };

$three = function() use (&$result)

{ var_dump($result); };

$result++;

$one(); // outputs NULL: $result is not in scope

$two(); // outputs int(0): $result was copied

$three(); // outputs int(1)

使用引用和不使用引用就代表了是调用时赋值,还是函数声明时赋值

以上就是php闭包有什么用?的详细内容,更多请关注其它相关文章!



Tags:php闭包   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
php闭包是什么?有什么用?下面本篇文章就来给大家介绍一下php闭包。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 什么是php闭包?PHP闭包实现主要就是靠匿名函...【详细内容】
2019-10-11  Tags: php闭包  点击:(587)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(41)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(65)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(129)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条