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

前言 记录Laravel框架源码中常用的方法
先看官网给出的描述
【【Laravel—源码常用方法】PHP|【Laravel—源码常用方法】PHP Closure::bind方法理解及使用】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

    推荐阅读