PHP的闭包-阿里云开发者社区

开发者社区> 技术mix呢> 正文

PHP的闭包

简介:
+关注继续查看

php的闭包(Closure)也就是匿名函数。是PHP5.3引入的。

闭包的语法很简单,需要注意的关键字就只有use,use意思是连接闭包和外界变量。

1
2
3
$a = function() use($b) {
 
}

闭包的几个作用:

1 减少foreach的循环的代码

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
// 一个基本的购物车,包括一些已经添加的商品和每种商品的数量。
// 其中有一个方法用来计算购物车中所有商品的总价格。该方法使用了一个closure作为回调函数。
class Cart
{
    const PRICE_BUTTER  = 1.00;
    const PRICE_MILK    = 3.00;
    const PRICE_EGGS    = 6.95;
 
    protected   $products = array();
     
    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.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);
        return round($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 减少函数的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 解除递归函数

1
2
3
4
5
6
7
8
9
10
<?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使用了&,这里不使用&会出现错误fib(fib(n-1)是找不到function的(前面没有定义fib的类型)

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

1
2
3
4
<?php
$recursive = function () use (&$recursive){
// The function is now available as $recursive
}

这样的形式

 

4 关于延迟绑定

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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)

 

使用引用和不使用引用就代表了是调用时赋值,还是申明时候赋值








本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
谷歌量子计算突破引爆学界,作者亲自回应质疑,国内专家点评
10 月 24 日,谷歌实现量子优越性的论文登上《自然》杂志封面,1 个月前已轰动业界的研究工作,再次成为科技圈关注的焦点。
3 0
如何在CRM WebClient UI里使用HANA Live Report
如何在CRM WebClient UI里使用HANA Live Report
4 0
作为程序员的他,大学四年一直自学,全靠这些实用工具和学习网站!
作为程序员的他,大学四年一直自学,全靠这些实用工具和学习网站!
4 0
ECS云服务器使用初体验
ECS云服务器搭建WordPress个人博客体验
19 0
雇佣劳工冒充AI?校园外卖机器人竟是远程人工操纵,时薪2美元
活跃在美国著名学府加州大学伯克利分校(UC Berkeley)校园的「明星」外卖机器人 Kiwibot,尽管看起来像是自动驾驶,实际上却是雇佣了远在哥伦比亚的真人进行远程人工操纵。最近,创业公司 Kiwibot 也陷入了用真人冒充 AI 的舆论漩涡。
5 0
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作(2)
【大学四年自学Java的学习路线】写了一个月,这是一份最适合普通大众、非科班的路线,祝你零基础快速找到一份满意的工作
4 0
这些插件太强了,Chrome 必装!尤其程序员!
这些插件太强了,Chrome 必装!尤其程序员!
5 0
5700元起,手势操控的谷歌Pixel 4正式发布,神秘AI芯片加持
昨晚的谷歌秋季发布会上,谷歌发布了一系列产品,包括 Pixel 4 和 Pixel 4 XL 手机,新的 Pixel Buds 耳机,Stadia,Nest Wifi,Nest Mini 智能音箱,和 Pixelbook Go 笔记本电脑。
3 0
这些软件太强了,Mac必装!尤其程序员!
这些软件太强了,Mac必装!尤其程序员!
4 0
+关注
2790
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载