PHP中function()与fn()执行结果不同的原因咨询
问题:PHP普通匿名函数与箭头函数执行结果差异原因分析
两段代码的核心差异在于PHP对普通匿名函数和箭头函数(fn())中$this的绑定规则不同:
1. 普通匿名函数的$this行为
在类方法内部定义的普通匿名函数(function() {}),默认不会自动继承外部作用域的$this(即当前类实例)。如果没有通过use关键字显式引入$this,闭包内部的$this无法指向类实例,导致对$this->checked的赋值操作无效。
要让第一段代码正常工作,需要显式通过use引入$this:
$this->allIds->each(function ($id) use ($this) { $this->checked[$id] = $this->checkedAll; });
2. 箭头函数的$this行为
箭头函数(PHP 7.4+引入)的设计逻辑是自动继承外部作用域的$this,无需额外声明。它会直接使用定义时所在上下文的类实例$this,所以第二段代码中,$this->checked[$id]能正确操作类实例的属性,得到预期的赋值结果。
总结
- 普通匿名函数:需显式通过
use($this)才能访问外部类实例的$this - 箭头函数:自动继承外部作用域的
$this,无需额外操作
内容的提问来源于stack exchange,提问作者ZoKeR
相关产品推荐
相关产品推荐

