在之前的文章中,我们已经学习过匿名函数的使用,没有看过的小伙伴可以进入传送门先去了解下闭包匿名函数的用法,传送:还不知道PHP有闭包?那你真OUT了。

关于闭包匿名函数,在JS中有个很典型的问题就是要给它绑定一个 this 作用域。其实这个问题在PHP中也是存在的,比如下面这段代码:$func = function($say){

echo $this->name, ':', $say, PHP_EOL;

};

$func('good'); // Fatal error: Uncaught Error: Using $this when not in object context

在这个匿名函数中,我们使用了 \$this->name 来获取当前作用域下的 $name 属性,可是,这个 $this 是谁呢?我们并没有定义它,所以这里会直接报错。错误信息是:使用了 $this 但是没有对象上下文,也就是说没有指定 $this 引用的作用域。

bindTo() 方法绑定 $this

好吧,那么我们就给它一个作用域,和 JS 一样,使用一个 bindTo() 方法即可。$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'); // Fatal error: Uncaught Error: Cannot access private property Lily::$name

call() 方法绑定 $this

在PHP7以后,PHP新增加了 call() 方法来进行匿名函数的 $this 绑定,我们来看看它和 bindTo() 方法有哪些区别。$func->call($lily, 'well'); // Lily:well

额......

是不是感觉方便好多。首先,它直接执行了,不需要再赋值给一个变量,也就是说,它不是去复制那个闭包函数的而是直接执行了;其次,没有 类作用域 这个概念了,第一个参数还是指定新的 $this 的指向,而后面的参数就是原来闭包函数的参数。

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

总结

其实包括闭包函数在内,这些特性都非常像JS。这也是语言融合的一种趋势,不管是学习了JS来看PHP的这些特性还是先学了PHP再去看JS,都会让我们更容易理解它们的作用与能力,这就是语言特性融合带来的好处。不管怎么样,学就是了,继续加油吧!!

各自媒体平台均可搜索【硬核项目经理】

php7 $this-,在PHP中如何为匿名函数指定this?相关推荐

  1. 如何在 C#9 中使用 static 匿名函数

    匿名函数 在 C# 中已经出现很多年了,虽然匿名函数用起来很爽,但代价是不小的,为了避免不必要那些你意想不到的内存分配,这就是为什么 C#9 中引入 static 匿名函数的原因,这篇文章我们将会讨论 ...

  2. java 匿名函数_Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

  3. 一木.溪桥学Python-09:函数的返回值、函数的作用域、作用域的优先级、递归函数、内置文件中常用方法、匿名函数lambda、高阶函数

    一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-09:函数的返回值.作用域.作用域的优先级.递归函数.内置文件中常用方法.匿名 ...

  4. 【Python】Python中的lambda匿名函数

    语法格式: lambda params:expr 注意事项: lambda只是一个表达式,函数体比def的简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装 ...

  5. python中的lambda匿名函数

    先看下面的这段代码. s="hello world " (lambda x: x.split())(s)#将英文句子x单词化. 结果 上面定义了一个匿名函数. 使用lambda的语 ...

  6. python中什么是匿名函数_python中的匿名函数

    匿名函数 函数可以像普通变量一样进行赋值 函数可以作为另一个函数的参数进行传递 def add(a, b): return a + b # 将函数作为参数 # 可以使函数的功能更加灵活多变 def c ...

  7. flink中的java匿名函数修改为实名函数

    [1]中有这么个代码 DataStream<Tuple2<String, Long>> keyedStream = env.addSource(consumer).flatMa ...

  8. Php中方法作用域,PHP 函数(下):匿名函数和作用域

    PHP 函数(下):匿名函数和作用域 由 学院君 创建于9个月前, 最后更新于 7个月前 版本号 #2 2282 views 1 likes 1 collects 匿名函数 从 PHP 5.3 开始, ...

  9. 类中匿名函数如何从 event 中去除

    匿名函数在各种event中如鱼得水的到处使用. 可是 把attach 到 Event  中的这些匿名函数 detach 是一个恼人的问题. 不建议在类的内部做一个 List<fn> , 这 ...

最新文章

  1. 无向图的最小生成树(克鲁斯卡尔算法 Kruskal)
  2. 网络请求中常见的加密机制和加密算法理解 流量加密
  3. RAID原理分析总结
  4. 编码(encode)问题
  5. vue-cli webpack 打包报错:Unexpected token: punc (()
  6. git 部分常用命令记录
  7. 获取access_token
  8. VC++ 获得程序运行根目录 汇编源码
  9. C语言复习4_while循环
  10. java调用数组计算器_java按钮控件数组实现计算器界面示例分享
  11. Raki的读paper小记:Model Zoo: A Growing “Brain” That Learns Continually
  12. Windows:电源计划:隐藏在深处的卓越性能,Get正确打开方式
  13. 读后感之悟道-一位20年IT高管的职场心得
  14. 台式机鼠标失灵打开计算机,台式电脑鼠标没反应是怎么回事
  15. 蚂蚁分类信息系统5.8 短信通道2 互亿无线配置使用说明
  16. 融云亮相GTC全球流量大会 荣膺鲸鸣奖2019年度优秀出海服务商
  17. java计算机毕业设计高速公路收费管理源码+mysql数据库+系统+lw文档+部署
  18. vue项目 编辑器保存代码后自动更新浏览器页面内容
  19. Photoshop%e5%bf%ab%e6%8d%b7%e9%94%ae%e5%ae%8c%e6%95%b4%e7%af%87
  20. chai断言库学习3-Core Plugin Concepts

热门文章

  1. R方差分析(anova)以及Tukey检验
  2. 什么是外函数,什么是内函数?闭包(Closure)是什么?说说你对闭包(Closure)的理解?
  3. Spark基础知识解答
  4. 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?
  5. java interface class_Java中常量定义在interface和class的区别(转)
  6. Nginx配置使用积累[不断更新]
  7. ajax更新,AJAX网址更新(AJAX URL update)
  8. np.reshape()用法
  9. 快速人脸验证--MobileFaceNets: Efficient CNNs for Accurate Real-time Face Verification on Mobile Devices
  10. mnist学习实例(2)