zoukankan      html  css  js  c++  java
  • PHP 闭包

    一、闭包基本用法
    闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数。比如下面的例子:
    // 定义一个闭包,并把它赋给变量 $f
    $f = function () {
        return 7;
    }
    
    // 使用闭包也很简单
    $f(); //这样就调用了闭包,输出 7
    
    // 当然更多的时候是把闭包作为参数(回调函数)传递给函数
    function testClosure (Closure $callback) {
        return $callback();
    }
    
    // $f 作为参数传递给函数 testClosure,如果是普遍函数是没有办法作为testClosure的参数的
    testClosure($f);
    
    // 也可以直接将定义的闭包作为参数传递,而不用提前赋给变量
    testClosure (function () {
        return 7;
    });
    
    // 闭包不止可以做函数的参数,也可以作为函数的返回值
    function getClosure () {
        return function () { return 7; };
    }
    
    $c = getClosure(); // 函数返回的闭包就复制给 $c 了
    $c(); // 调用闭包,返回 7
    二、闭包类(Closure)
    定义一个闭包函数,其实是产生了一个闭包类(Closure)的对象,Closure类摘要如下:
    Closure {   
        public static Closure bind (Closure $closure , object $newthis [, mixed $newscope = 'static' ])  
        public Closure bindTo (object $newthis [, mixed $newscope = 'static' ])  
    } 
    方法说明:
    Closure::bind: 复制一个闭包,绑定指定的$this对象和类作用域。
    Closure::bindTo: 复制当前闭包对象,绑定指定的$this对象和类作用域。
    下面将介绍Closure::bind和Closure::bindTo
    参数和返回值说明:
    closure:表示需要绑定的闭包对象。
    newthis:表示需要绑定到闭包对象的对象,或者NULL创建未绑定的闭包。
    newscope:表示想要绑定给闭包的类作用域,可以传入类名或类的示例,默认值是 'static', 表示不改变。
    该方法成功时返回一个新的 Closure 对象,失败时返回FALSE。
    class Animal {  
        private static $cat = "cat";  
        private $dog = "dog";  
        public $pig = "pig";  
    }  
    
    /*  
     * 获取Animal类静态私有成员属性 
     */  
    $cat = static function() {  
        return Animal::$cat;  
    };  
    
    /*  
     * 获取Animal实例私有成员属性 
     */  
    $dog = function() {  
        return $this->dog;  
    };  
    
    /*  
     * 获取Animal实例公有成员属性 
     */  
    $pig = function() {  
        return $this->pig;  
    };  
    
    $bindCat = Closure::bind($cat, null, new Animal());// 给闭包绑定了Animal实例的作用域,但未给闭包绑定$this对象  
    $bindDog = Closure::bind($dog, new Animal(), 'Animal');// 给闭包绑定了Animal类的作用域,同时将Animal实例对象作为$this对象绑定给闭包  
    $bindPig = Closure::bind($pig, new Animal());// 将Animal实例对象作为$this对象绑定给闭包,保留闭包原有作用域  
    echo $bindCat(),'<br>';// 根据绑定规则,允许闭包通过作用域限定操作符获取Animal类静态私有成员属性  
    echo $bindDog(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象(Animal实例对象)获取Animal实例私有成员属性  
    echo $bindPig(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象获取Animal实例公有成员属性
    
    // bindTo与bind类似,是面向对象的调用方式,这里只举一个,其他类比就可以
    $bindCat = $cat->bindTo(null, 'Animal');
    最后举一个PHP官网给出的例子
    class A {
        function __construct($val) {
            $this->val = $val;
        }
        function getClosure() {
            //returns closure bound to this object and scope
            return function() { return $this->val; };
        }
    }
    
    $ob1 = new A(1);
    $ob2 = new A(2);
    
    $cl = $ob1->getClosure();
    echo $cl(), "
    ";
    $cl = $cl->bindTo($ob2);
    echo $cl(), "
    ";
    以上示例输出:
    1
    2
     
     
     
  • 相关阅读:
    多线程编程1-定义理解与三种实现方式
    Java类集框架详细汇总-底层分析
    Trie、并查集、堆、Hash表学习过程以及遇到的问题
    spring前导知识-Tomcat、Maven等配置
    双指针、位运算、离散化、区间合并的手动模拟
    单点登录原理与简单实现
    Spring引入外部配置文件
    Java异常机制
    Java多线程-线程的概念和创建
    java webservice服务器端获取request对象的三种方式
  • 原文地址:https://www.cnblogs.com/sgm4231/p/9772525.html
Copyright © 2011-2022 走看看