一、闭包概念
接触过JavaScript朋友可能对闭包有所熟悉,因为JS中我们会经常用到闭包函数,非常方便,呐,PHP5.3也开始引入了闭包的特性。要了解闭包,我们先要知道何为匿名函数,也叫闭包函数(closures),PHP的闭包实现主要是由其完成的。
先看一个函数:
$func = function(){
}; // 注意:这里带结束符
可以看到,匿名函数没有名字,如果要使用它,需要将其返回给一个变量,匿名函数像其他普通函数一样,也可以传递参数。
// 带参数的匿名函数
$func = function( $param ) {
echo $param;
};
$func( 'some string' );
二、闭包的应用
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 (变量)的方式。