FileSystem中的getRequire函数为什么要这么写?
1. 运行环境
1). 当前使用的 Laravel 版本?8.75
2. 问题描述?
public function getRequire($path, array $data = [])
{
if ($this->isFile($path)) {
$__path = $path;
$__data = $data;
return (static function () use ($__path, $__data) {
extract($__data, EXTR_SKIP);
return require $__path;
})();
}
throw new FileNotFoundException("File does not exist at path {$path}.");
}
我的疑问一:为什么要创建两个新变量$__path $__data
我的疑问二:为什么要创建一个静态匿名函数来执行这两行代码,而不是直接执行这两行,有什么区别?
我知道的是,使用静态匿名函数的话,就可以不用绑定$this。
3. 您期望得到的结果?
希望有人能为我解释这两个疑问
4. 我的结论
看了 振翅飞翔 和 deatil 的解答,我明白了一些,我原来没有想到变量污染的问题。一想到这点,我又看到extract函数的第二个参数是EXTR_SKIP,我想我明白了。不用匿名函数,如果extract出来的变量里有path和data,就会因为当前环境中已经存在而被忽略,这不是想要的结果。用了匿名函数就没有这个问题了,因为当前环境中只有__path
和__data
这两个变量。
放到匿名函数里面是为了防止
extract
出来的变量污染到了path
和data
这两个变量静态匿名函数就是以前创建的单独的函数用新特征来重构的
单独创建变量是为了防止数据污染吧,引入的文件里就不能直接用$data这个变量。
好像前面楼说的防止污染原始的两个变量