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