zoukankan      html  css  js  c++  java
  • PHP闭包函数

    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()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。

  • 相关阅读:
    (二)常问升级小点
    (一)常问基础小点
    Linux之expr命令详解
    Mac--Visual Studio Code 常用快捷键
    git撤销commit操作回到add状态
    ExampleMatcher ,在查询非int 或boolean 字段时要使用 withIgnorePaths() 忽略 int 和boolean 字段,要不然查询不到值
    navicat 用url 连接mongo
    javase 打印杨辉三角
    关系型数据库遵循ACID规则
    Redis介绍
  • 原文地址:https://www.cnblogs.com/muziyun1992/p/6801980.html
Copyright © 2011-2022 走看看