Laravel中匿名函数可清缓存,箭头函数失效的原因?
箭头函数调用Laravel Cache::forget无效的原因
在PHP 7.4、Laravel 8.0环境下,使用匿名函数调用Cache::forget($key)能正常清除缓存:
$collect->each(function($key) { Cache::forget($key); });
但改用箭头函数后操作无效:
$collect->each(fn($key)=> Cache::forget($key));
原因分析
问题出在PHP箭头函数和传统匿名函数的作用域差异上:
- PHP 7.4的箭头函数会自动以词法方式捕获父作用域的
$this,不需要显式声明; - 传统匿名函数默认不会捕获
$this,除非通过use($this)手动指定。
Laravel的Cache等Facade依赖服务容器解析对应的缓存实例,其静态调用(如Cache::forget())是通过__callStatic魔术方法转发到容器中的实例。当箭头函数在类上下文(比如控制器、模型方法)中使用时,自动捕获的$this会干扰Facade的解析流程:魔术方法在处理静态调用时,会误将当前$this的上下文作为解析容器的依据,导致无法正确获取缓存驱动实例,最终使得缓存清除操作失效。
而传统匿名函数因为没有自动捕获$this,Facade会按照全局服务容器的正常路径解析,因此能顺利执行缓存清除。
如果要验证这个结论,可以在箭头函数中使用Facade的完整命名空间调用:
$collect->each(fn($key)=> \Illuminate\Support\Facades\Cache::forget($key));
此时操作应该能正常生效,这也印证了是作用域导致的Facade类名解析异常。
内容的提问来源于stack exchange,提问作者DarkFenix
相关产品推荐
相关产品推荐

