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模式中。

    相关文章

      网友评论

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

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