php闭包函数(二)

袁志蒙 3773次浏览

摘要:在PHP中,可以理解闭包是由匿名函数构成的一种“结构”。就像string,int等,可以把闭包函数作为变量的值来使用。PHP会自动把此种表达式转换成内置类 Closure 的对象实例。在上文中我有说道...

在PHP中,可以理解闭包是由匿名函数构成的一种“结构”。

就像string,int等,可以把闭包函数作为变量的值来使用。PHP会自动把此种表达式转换成内置类 Closure 的对象实例。


1.在上文中我有说道匿名函数(闭包函数)调用方式是 变量名() 其实就是调用了Closure类中的__invoke()方法,证明一下:

$var = function ($name) {
    return 'Hello ' . $name . '<br>';
};

echo $var->__invoke("yzmcms");
echo $var("yzmcms");
// 运行结果:
// Hello yzmcms
// Hello yzmcms

2.php闭包使用例子:

class test{
    private $_factory;
    public function set($id, $value){
        $this->_factory[$id] = $value;
    }
    
    public function get($id){
        $value = $this->_factory[$id];
        return $value();	//如果不加括号,仅仅返回的是闭包类的一个对象,并不是user实例
    }
}
class user{
    private $_username;
    function __construct($username = '') {
		echo '我被实例化了<br>';
        $this->_username = $username;
    }
    function get_username(){
        return $this->_username;
    }
}


$test = new test();
$test->set('zhangsan', function(){
    return new user('张三');
});
$test->set('lisi', function(){
   return new user('李四'); 
});
echo $test->get('zhangsan')->get_username();	
echo '<br>';
echo $test->get('lisi')->get_username();

// 运行结果:
// 我被实例化了
// 张三
// 我被实例化了
// 李四

代码test类中有一个工厂($_factory)用来保存对象实例,然后通过set()方法注册服务,通过get()方法获取服务。

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

随机内容

表情

共1条评论
  • 网友评论:

    老师讲解的不错

    2019-04-18 16:17:27 回复

    点击加载