PHP闭包Closure研究

一、闭包概念

      接触过JavaScript朋友可能对闭包有所熟悉,因为JS中我们会经常用到闭包函数,非常方便,呐,PHP5.3也开始引入了闭包的特性。要了解闭包,我们先要知道何为匿名函数,也叫闭包函数(closures),PHP的闭包实现主要是由其完成的。

先看一个函数:

$func = function(){

};  // 注意:这里带结束符

可以看到,匿名函数没有名字,如果要使用它,需要将其返回给一个变量,匿名函数像其他普通函数一样,也可以传递参数。

// 带参数的匿名函数
$func = function( $param ) {
    echo $param;
};
 
$func( 'some string' );


二、闭包的应用

<?php
header("Content-Type:text/html;charset=utf-8");

 class Di{
    private $_factory;
   
    public function set($id,$value){
 
       $this->_factory[$id] = $value;
    }
    
   
    public function get($id){
 
       $value = $this->_factory[$id];
 
       return $value();
    }
 }

 class User{
  private $_username;
    function __construct($username="") {
        $this->_username = $username;
    }
    function getUserName(){
        return $this->_username;
    }
 }
 
// 从这里开始看
$di = new Di();
$di->set("zhangsan",function(){
    return new User('张三');
 });
 
$di->set("lisi",function(){
   return new User("李四"); 
 });
echo $di->get("zhangsan")->getUserName();
echo $di->get("lisi")->getUserName();


代码中有一个Di容器用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。

我们看到$di->set()的时候,使用了匿名函数,我们预先注册了zhangsan和lisi两个服务,这两个服务都是User类的实例,在$di->set的时候实际上并没有实例化,而是在$di->get()的时候才执行了匿名函数并将对象返回,这就实现了按需实例化,不用则不实例化,提高效率。

三、闭包特性

经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。


你可能感兴趣的:(PHP,匿名函数,闭包)