zoukankan      html  css  js  c++  java
  • Closure

    Closure
     php5.3有一个非常赞的新特性,那就是支持匿名函数(闭包)。匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子:
    1. $func = function(){
    2.     exit('Hello world!!');
    3.  };//这里必须要有;结尾
    4. $func();
    复制代码
    等效于
    1. function func(){
    2.     exit('Hello world!!');
    3.  }
    4. func();
    复制代码
    看上去没什么新奇的地方是不?(☆_☆)/~~
    别急,继续看。

    看这段代码:
    1. function operate($operator){
    2.     if($operator == "-"){
    3.         return function($a,$b){
    4.             return $a-$b;
    5.         };
    6.     }else{
    7.         return function($a,$b){
    8.             return $a+$b;
    9.         };
    10.     }
    11.  }
    12. $subtraction = operate("-");
    13. echo $subtraction(4,3);//1
    14. $addition = operate("+");
    15. echo $addition(1,2);//3
    复制代码
    通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。

    如果说仅仅是这样的话,那么我并不觉得它有多少吸引力,下面我将展示一个实战中用到的技巧:
    1. <?php
    2. header("Content-Type:text/html;charset=utf-8");
    3.  class Di{
    4.     private $_factory;
    5.     public function set($id,$value){
    6.         $this->_factory[$id] = $value;
    7.     }
    8.     
    9.     public function get($id){
    10.         $value = $this->_factory[$id];
    11.         return $value();
    12.     }
    13.  }
    14.  class User{
    15.     private $_username;
    16.     function __construct($username="") {
    17.         $this->_username = $username;
    18.     }
    19.     function getUserName(){
    20.         return $this->_username;
    21.     }
    22.  }
    23.  //从这里开始看
    24. $di = new Di();
    25. $di->set("zhangsan",function(){
    26.     return new User('张三');
    27.  });
    28. $di->set("lisi",function(){
    29.    return new User("李四"); 
    30.  });
    31. echo $di->get("zhangsan")->getUserName();
    32. echo $di->get("lisi")->getUserName();
    复制代码
    代码中有一个Di容器用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。
    我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。

    闭包特性
    经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。
    1. function func1($a){
    2.     return function() use ($a){
    3.         echo $a;
    4.     };
    5.  }
    6. $a = func1("a");
    7. $a();//输出a
    复制代码
    当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。

    闭包的用途可以用于很多地方,常见于DI模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。
  • 相关阅读:
    我的浏览器收藏夹分类
    我的浏览器收藏夹分类
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 318 最大单词长度乘积
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 316 去除重复字母
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
    Java实现 LeetCode 315 计算右侧小于当前元素的个数
  • 原文地址:https://www.cnblogs.com/wwlww/p/8413420.html
Copyright © 2011-2022 走看看