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 (變量)的方式。對象

相關文章
相關標籤/搜索