当前位置: 首页 > 后端技术 > PHP

如何在PHP中为匿名函数指定this?

时间:2023-03-30 04:59:48 PHP

在上一篇文章中,我们已经学习了匿名函数的使用。没有看过的朋友可以进入传送门了解一下闭包匿名函数的用法。传送:不知道PHP有闭包?那你真的OUT了。关于闭包匿名函数,在JS中一个很典型的问题就是给它绑定一个this作用域。其实这个问题在PHP中也存在,比如下面的代码:$func=function($say){echo$this->name,':',$say,PHP_EOL;};$func('good');//Fatalerror:UncaughtError:Using$thiswhennotinobjectcontext在这个匿名函数中,我们使用\$this->name获取当前作用域中的$name属性,但是这个$this是谁呢?我们没有定义,所以这里会直接报错。报错信息为:$thisisusedbutthereisnoobjectcontext,即未指定$this引用的范围。bindTo()方法绑定$this好吧,那我们就给它一个作用域,就像JS一样,用一个bindTo()方法就可以了。$func1=$func->bindTo($lily,'Lily');//$func1=$func->bindTo($lily,Lily::class);//$func1=$func->bindTo($lily,$百合);$func1('酷');这次可以正常输出了。bindTo()方法是复制一个当前的闭包对象,然后绑定到$this作用域和类作用域。其中,$lily参数是一个对象$newthis参数,就是为复制的匿名函数指定$this。第二个参数'Lily'是绑定一个新的类作用域,它代表一个类型,决定了在这个匿名函数中可以调用哪些private和protected方法。上面例子给出的三种方法都可以用来定义这个参数。如果没有给出这个参数,那么我们就不能访问私有的$name属性:$func2=$func->bindTo($lily);$func2('cool2');//Fatalerror:UncaughtError:CannotaccessTheprivatepropertyLily::$namecall()methodbinding$this在PHP7之后,PHP新增了一个call()方法来绑定匿名函数的$this。让我们看一下它与bindTo()方法的区别。$func->call($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.phphttps://www.php.net/manual/zh/closure.bindto.phphttps://www.php.net/manual/en/closure.call.php各媒体平台均可搜索【硬核项目经理】