【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
推荐阅读
- 宽容谁
- 我要做大厨
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷