Closure

Posted wwlww

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。

以上是关于Closure的主要内容,如果未能解决你的问题,请参考以下文章

Python笔记

GroovyGroovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )

GroovyGroovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )