【转】PHP中闭包Closure::bind详解

最近在看laravel底层代码时 ,发现代码中很多Closure::bind用法,查询各种资料,一直对它的使用一直半解(网上大多都是抄袭教材,解释的不清楚),还好经过我不懈努力,终于弄懂了其中道理。

1、在正式解释前我们先了解一些基础的东西(稍安勿躁,磨刀不误砍柴工。大多说看不懂其用法的人,主要还是基础不牢)。php中 闭包我们也可以叫做匿名函数,匿名函数不了解的可以自行补一下,我这边简单举例:

 

2、接着我们来说一下php的public、protected、private三种访问控制模式的区别
public: 公有类型,在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法
在实例中可以通过$obj->var 来调用 public类型的方法或属性

protected: 受保护类型,在子类中可以通过self::var调用protected方法或属性,parent::method调用父类方法。
在实例中不能通过$obj->var 来调用 protected类型的方法或属性

private: 私有类型,该类型的属性或方法只能在该类中使用,在该类的子类中都不能调用私有类型的属性和方法。

 

3、在以上都理解的情况下 我们来看看这样的情况,有如下匿名函数:

其实单独这段代码是肯定不能运行的,因为里面有个$this,程序压根不知道你这个$this是代表哪个对象或哪个类,因此想让其正常运行肯定有前提条件啊(就好比你想遍历某个数组一样,如果这个数组压根你就没提前定义声明,那么肯定会报错的)
如果这样:

 

为了加深理解我在举两个例子:

 

下面来看最后一例子,再次加深一下理解:

 

综上大家应该理解其用法了吧,有时第二个参数为null,有时第三个参数可以不要,这些都跟你匿名函数里 代码中访问的方式紧密相关
总结:
1、一般匿名函数中有$this->name类似这样用 $this访问属性方式时,你在使用bind绑定时 ,第二个参数肯定要写,写出你绑定那个对象实例,第三个参数要不要呢,要看你访问的这个属性,在绑定对象中的权限属性,如果是private,protected 你要使用第三个参数 使其变为公有属性, 如果本来就是公有,你可以省略,也可以不省略
2、一般匿名函数中是 类名::静态属性 类似这样的访问方式(比如例子中A::$weight),你在使用bind绑定时,第二个参数可以写null,也可以写出具体的对象实例,一般写null就行(写了具体对象实例多此一举),第三个参数写不写还是得看你访问的这个静态属性的权限是 private 还是 public,如果是私有private或受保护protected的,你就得第三个参数必须写,才能使其权限变为公有属性 正常访问,如果本来就是公有public可以不用写,可以省略。

原文链接:https://blog.csdn.net/qq_27718961/article/details/91043221

发表评论

邮箱地址不会被公开。 必填项已用*标注