🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
http://www.thinkphp.cn/topic/13624.html 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. returnfunction($a,$b){ 4. return $a-$b; 5. }; 6. }else{ 7. returnfunction($a,$b){ 8. return $a+$b; 9. }; 10. } 11. } 13. $subtraction = operate("-"); 14. echo $subtraction(4,3);//1 15. $addition = operate("+"); 16. echo $addition(1,2);//3 复制代码 `通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。 如果说仅仅是这样的话,那么我并不觉得它有多少吸引力,下面我将展示一个实战中用到的技巧:` 1. <?php 2. header("Content-Type:text/html;charset=utf-8"); 3. classDi{ 4. private $_factory; 5. publicfunctionset($id,$value){ 6.         $this->_factory[$id]= $value; 7. } 9. publicfunctionget($id){ 10.         $value = $this->_factory[$id]; 11. return $value(); 12. } 13. } 15. classUser{ 16. private $_username; 17. function __construct($username=""){ 18.         $this->_username = $username; 19. } 20. function getUserName(){ 21. return $this->_username; 22. } 23. } 25. //从这里开始看 26. $di =newDi(); 27. $di->set("zhangsan",function(){ 28. returnnewUser('张三'); 29. }); 30. $di->set("lisi",function(){ 31. returnnewUser("李四"); 32. }); 34. echo $di->get("zhangsan")->getUserName(); 35. 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. returnfunction()use($a){ 3.         echo $a; 4. }; 5. } 6. $a = func1("a"); 7. $a();//输出a 复制代码 `当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。 闭包的用途可以用于很多地方,常见于DI模式中,这篇文章的代码只是为了说明,不可以直接使用,谢谢。