闭包 | 匿名函数

Closure::__construct 用于禁止实例化的构造函数
Closure::bind 复制一个闭包,绑定指定的 $this 对象和类作用域。
Closure::bindTo 复制当前闭包对象,绑定指定的 $this 对象和类作用域。

 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实例公有成员属性

延迟加载

    class Log
    {
        public function write()
        {
            echo '写入日志';
        }
    }

    class Test
    {
        // 通过构造函数传参创建闭包, `new Log` 不会马上执行 
        public function __construct($name)
        {
            $this->bind['log'] = function () use ($name) {

                return new $name();
            };
        }

        // 调用闭包, 通过 $this当前对象 返回 Log 实例化  
        public function execute()
        {
            return $this->bind['log']($this);
        }
    }

    $test = new Test('Log');
    $log  = $test->execute();
    $log->write();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。