php匿名函数为何不匿名,php匿名函数和回调函数
PHP中匿名函数如何指定这个?在上一篇文章中,我们已经学习了匿名函数的使用。没看过的可以进入门户了解一下闭包下匿名函数的使用。传输:你不知道PHP有闭包吗?那真的是出于你。
至于闭包的匿名函数,JS中的一个典型问题就是用这个作用域绑定它。其实这个问题在PHP中也存在,比如下面这段代码:
$func=函数($say){
echo $this- name,:,$say,PHP _ EOL
};
$ func( good );//fatalerror:未捕获错误:使用$this当不在此匿名函数的对象上下文中时,我们使用\$this- name获取当前作用域下的$name属性。但是,这$这是谁?我们没有定义,这里直接报错。错误是:使用了$this但是没有对象上下文,也就是没有指定$this引用的范围。
BindTo()方法绑定$this。好吧,那我们给它一个范围。就像JS一样,使用bindTo()方法。
$func1=$func- bindTo($lily, Lily );
//$func1=$func- bindTo($lily,Lily:class);
//$func1=$func- bindTo($lily,$ lily);
$ func 1( cool );这次可以正常输出了。bindTo()方法是复制一个当前闭包对象,然后用$this作用域和class作用域绑定。其中$lily参数是一个对象$newthis参数,也就是为这个复制的匿名函数指定了$this。第二个参数 Lily 是绑定一个新的类作用域,它表示一个类型,并确定在这个匿名函数中可以调用哪些私有和受保护的方法。上述示例中给出的三种方法可用于定义该参数。如果不给出这个参数,那么我们就不能访问这个私有的$name属性:
$ func 2=$ func-bind to($ lily);
$ func 2( cool 2 );//fatalerror:未捕获的错误:无法访问私有属性lily: $ namecall()方法绑定$this。PHP7之后,PHP新加入了匿名函数$this绑定的call()方法。让我们看看它和bindTo()方法的区别。
$func- call($lily,‘嗯’);//莉莉:嗯,嗯.
是不是感觉方便多了?首先是直接执行,不需要赋给变量,即直接执行而不是复制闭包函数;其次,没有类范围的概念。第一个参数仍然指定新$this的点,后面的参数是原来闭包函数的参数。
虽然方便,但也带来了另一个问题,因为没有类范围的限制,所以会打破封装。您设法做出的面向对象的设计封装了一堆属性,然后使用这个调用()来公开对象的所有私有和受保护的内容。当然这也要看我们自己的经营情况。毕竟我们在写代码的时候可以自由选择两种形式。
其实总结包括了闭包函数,这些功能和JS很像。这也是语言融合的一个趋势。无论是学习JS看PHP的这些特性,还是先学习PHP再看JS,都会让我们更容易理解它们的功能和能力,这就是语言特性集成的好处。反正就是学,继续加油!
测试代码:
3359 github . com/zhangyue 0503/dev-blog/blob/master/PHP/202002/source/PHP中匿名函数如何指定这个?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
版权归作者所有:原创作品来自博主,码农老张,转载请联系作者获得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。