php匿名函数(闭包)

作者: f09037cb27f7 | 来源:发表于2017-07-31 11:11 被阅读124次

匿名函数可用于动态创建函数,并保存到一个变量中。举个栗子:

$func = function(){
    exit('Hello world!!');
};//这里必须要有;结尾
$func();

等效于:

function func(){
    exit('Hello world!!');
}
func();

看上去没什么新奇的地方,别急,继续看。


function operate($operator){
    if($operator == "-"){
        return function($a,$b){
            return $a-$b;
        };
    }else{
        return function($a,$b){
            return $a+$b;
        };
    }
}
$subtraction = operate("-");
echo $subtraction(4,3);//1
$addition = operate("+");
echo $addition(1,2);//3

通过operate函数,我们可以生成不同的函数作为结果返回,并将这个结果直接作为函数调用,上面的代码分别动态创建了减法运算和加法运算函数。


展示一个实战中用到的技巧:

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

闭包特性:
经常写js的同学应该知道js的闭包特性,简单的说就是在一个函数里可以定义子函数,父函数中的变量在子函数中可以直接使用,那么PHP的闭包怎么用呢?有一点区别。

function func1($a){
    return function() use ($a){
        echo $a;
    };
}
$a = func1("a");
$a();//输出a

当你想将外层变量传进内层匿名函数时,使用use (变量)的方式。
闭包的用途可以用于很多地方,常见于DI模式中。

相关文章

  • Modern PHP : 闭包和匿名函数

    Modern PHP : 闭包和匿名函数

  • php中的匿名函数和闭包

    php中的匿名函数和闭包(closure) 一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函...

  • php闭包函数(Closure)

    匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个...

  • PHP闭包(Closure)初探

    匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个...

  • [正儿八经PHP]PHP闭包(Closure)初探

    匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个...

  • PHP新特性之闭包、匿名函数

    闭包 闭包是什么? 1).闭包和匿名函数在PHP5.3中被引入。2).闭包是指在创建时封装函数周围状态的函数,即使...

  • 计算机概念100

    php闭包: 匿名函数 a){}程序闭包: 就是函数内部的函数流式文件: 二进制文件(不受物理符号(如回车符)...

  • Python中的闭包

    php对闭包的定义是匿名函数,我之前对python闭包的理解是:外部函数以内部函数作为返回值,称之为闭包!!!(错...

  • PHP闭包实现

    闭包是指在创建时封装周围状态的函数。即使闭包所在的环境不在了,闭包中封装的状态依旧存在。注意在php中匿名函数=闭...

  • php中闭包的使用

    最重要的一句话:闭包函数继承变量的值的时候,是闭包函数定义的时候,而不是闭包函数被调用的时候。php中,匿名函数也...

网友评论

    本文标题:php匿名函数(闭包)

    本文链接:https://www.haomeiwen.com/subject/chillxtx.html