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