php闭包有什么用?

php闭包有什么用?

内容导读

收集整理的这篇技术教程文章主要介绍了php闭包有什么用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3284字,纯文字阅读大概需要5分钟

内容图文

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

什么是php闭包?

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

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

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

闭包的两个持点:

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

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

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

php闭包有什么用?

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

闭包的几个作用:

1、减少foreach的循环的代码

比如手册http://php.com/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相关知识,请访问PHP中文网!

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

内容总结

以上是为您收集整理的php闭包有什么用?全部内容,希望文章能够帮你解决php闭包有什么用?所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com