PHP闭包Closure研究

1、闭包概念php

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

先看一个函数:闭包

$func = function(){

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

能够看到,匿名函数没有名字,若是要使用它,须要将其返回给一个变量,匿名函数像其余普通函数同样,也能够传递参数。
函数

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


2、闭包的应用this

<?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()方法获取服务。spa

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

3、闭包特性htm

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

相关文章
相关标签/搜索