【Laravel—源码常用方法】PHP Closure::bind方法理解及使用

前言

记录Laravel框架源码中常用的方法

先看官网给出的描述

Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域。

参数1:需要绑定的匿名函数。
参数2:需要绑定到匿名函数的对象,或者 NULL 创建未绑定的闭包。
参数3:想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。

还不明白就继续往下走

闭包函数

//创建,如果没有引用外部参数可以不写use($name)
$name = 'closure';
$closure1 = function() use($name) {
  echo 'this is ' . $name;
};
//使用
//输出 this is closure
$closure1();

闭包函数与类的使用

先写一个测试类
class Test
{

    public function publicFunction()
    {
        echo "this is publicFunction 
"; } private function privateFunction() { echo "this is privateFunction
"; } private static function privateStaticFunction() { echo "this is privateStaticFunction
"; } }
(1) 闭包函数中使用$this,通过Closure::bind方法将指定类绑定至$this
//闭包函数中使用\$this,这里的$this并没有指定使用的类,但是没有被具体使用所有不会报错

$closure2 = function () {
    return $this->publicFunction();
};


//这里具体使用就会报错:Fatal error: Uncaught Error: Using $this when not in object context
$closure2();

//此时就用到Closure::bind方法将Test类绑定到这个闭包函数,
//并返回一个与原来的闭包函数($closure2)一样且绑定了Test类的闭包函数($closure2ForBind)
$closure2ForBind = Closure::bind($closure2, new Test());

//使用
//输出 this is publicFunction
$closure2ForBind();
(2) 闭包函数中调用受保护或私有的属性及方法
//接下来在闭包函数中调用Test类的私有方法
$closure3 = function () {
    return $this->privateFunction();
};
$closure3ForBind = Closure::bind($closure3, new Test());
//将会报:Fatal error: Uncaught Error: Call to private method Test::privateFunction() from context 'Closure'
$closure3ForBind();

//这里涉及到Closure::bind的第三个参数类作用域
$closure3ForBind = Closure::bind($closure3, new Test(), new Test());
//使用
//输出 this is privateFunction
$closure3ForBind();
(3) 静态方式调用
$closure4 = function () {
    return Test::privateStaticFunction();
};

//这里是静态方式调用已经指定了Test类,所以第二个方法不需要传入指定的类,传入null就好
$closure4ForBind = Closure::bind($closure4, null, 'Test');
$closure4ForBind();

END

你可能感兴趣的:(【Laravel—源码常用方法】PHP Closure::bind方法理解及使用)