关于闭包匿名函数,在JS中有个很范例的问题便是要给它绑定一个 this 浸染域。
实在这个问题在PHP中也是存在的,比如下面这段代码

$func=function($say){echo$this->name,':',$say,PHP_EOL;};$func('good');//Fatalerror:UncaughtError:Using$thiswhennotinobjectcontext

在这个匿名函数中,我们利用了 $this->name 来获取当前浸染域下的 $name 属性,可是,这个 $this 是谁呢?我们并没有定义它,以是这里会直接报错。
缺点信息是:利用了 $this 但是没有工具高下文,也便是说没有指定 $this 引用的浸染域。

bindTo() 方法绑定 $this

好吧,那么我们就给它一个浸染域,和 JS 一样,利用一个 bindTo() 方法即可。

phpthis在PHP中若何为匿名函数指定this PHP

$func1=$func->bindTo($lily,'Lily');//$func1=$func->bindTo($lily,Lily::class);//$func1=$func->bindTo($lily,$lily);$func1('cool');

这回就可以正常输出了。
bindTo() 方法是复制一个当前的闭包工具,然后给它绑定 $this 浸染域和类浸染域。
个中, $lily 参数是一个 object $newthis 参数,也便是给这个复制出来的匿名函数指定 $this 。
而第二个参数 'Lily' 则是绑定一个新的 类浸染域 ,它代表一个类型、决定在这个匿名函数中能够调用哪些 私有 和 受保护 的方法,上例中给出的三种办法都可以用来定义这个参数。
如果不给这个参数,那么我们就不能访问这个 private 的 $name 属性了:

$func2=$func->bindTo($lily);$func2('cool2');//Fatalerror:UncaughtError:CannotaccessprivatepropertyLily::$namecall() 方法绑定 $this

在PHP7往后,PHP新增加了 call() 方法来进行匿名函数的 $this 绑定,我们来看看它和 bindTo() 方法有哪些差异。

$func->call($lily,'well');//Lily:well

额......

是不是觉得方便好多。
首先,它直接实行了,不须要再赋值给一个变量,也便是说,它不是去复制那个闭包函数的而是直接实行了;其次,没有 类浸染域 这个观点了,第一个参数还是指定新的 $this 的指向,而后面的参数便是原来闭包函数的参数。

虽然很方便,但是它也带来了另一个问题,由于没有 类浸染域 的限定,以是会毁坏封装。
你好不容易做好的面向工具的设计,封装了一堆属性,然后利用这个 call() 就让工具的所有 私有 和 受保护 内容都暴露了出来。
当然,这也是看我们自己的业务情形了,毕竟两种形式我们在写代码的时候都是可以自由选择的。

总结

实在包括闭包函数在内,这些特性都非常像JS。
这也是措辞领悟的一种趋势,不管是学习了JS来看PHP的这些特性还是先学了PHP再去看JS,都会让我们更随意马虎理解它们的浸染与能力,这便是措辞特性领悟带来的好处。
不管怎么样,学便是了,连续加油吧!

测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E5%9C%A8PHP%E4%B8%AD%E5%A6%82%E4%BD%95%E4%B8%BA%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0%E6%8C%87%E5%AE%9Athis%EF%BC%9F.php

参考文档: https://www.php.net/manual/zh/functions.anonymous.php https://www.php.net/manual/zh/closure.bindto.php https://www.php.net/manual/en/closure.call.php