请参阅以下功能以扫描目录中的文件(取自here)
function scandir_only_files($dir) {
return array_filter(scandir($dir), function ($item) {
return is_file($dir.DIRECTORY_SEPARATOR.$item);
});
}
这不起作用,因为$ dir不在匿名函数的范围内,并且显示为空,导致过滤器每次都返回FALSE。我该怎么改写这个?
答案 0 :(得分:15)
您必须使用use
关键字显式声明从父作用域继承的变量:
// use the `$dir` variable from the parent scope
function ($item) use ($dir) {
function scandir_only_files($dir) {
return array_filter(scandir($dir), function ($item) use ($dir) {
return is_file($dir.DIRECTORY_SEPARATOR.$item);
});
}
请参阅匿名函数页面中的this example。
闭包可以从父作用域继承变量。必须在函数头中声明任何此类变量。闭包的父作用域是声明闭包的函数(不一定是从中调用它的函数)。