PHP在这种情况下使用()函数


PHP use() Function In This Situation

我试图通过目录循环,只显示文件,没有文件夹。我在SO上从另一个人那里遇到了这段代码,虽然它可以工作,但我不明白是怎么回事。

function scandir_nofolders($d) {
    return array_filter(scandir($d), function ($f) use($d) {
       return ! is_dir($d . "/" . $f);
   });
}

那么假设我用下面的代码运行它:

print_r(scandir_nofolders('/xampp');

当is_dir()函数确定所提供的参数是否为目录时,我挣扎的地方是最内部的返回值。

你认为代码应该翻译成

return ! is_dir('/xampp'./.'/xampp');

注意在上面的例子中$d和$f是相同的。如果你调用一个匿名函数并使用use函数在这种情况下使用$d, $d和$f不应该是完全相同的吗,因为$f实际上是复制了$d ?显然,我不是在寻找/xampp//xampp(这是我认为代码将转换成的),但它可以完美地工作。有人能解释一下这段代码到底是干什么的吗?我想,如果有的话,我误解了use()函数的真正目的。

如果您碰巧了解Javascript,那么等效的代码将是:

function scandir_nofolders(d) {
    return scandir(d).filter(function (f) {
       return !is_dir(d + "/" + f);
   });
}

这是怎么回事?最里面的is_dir调用使用df的连接。d是传递给函数的同一个d, fscandir返回的数组中一个元素的值。在Javascript中,函数的父作用域的变量和函数内部的变量一样可用。

在PHP中,情况并非如此。

$d = 'foo';
function () {
    // no access to $d here
}

要使$d在匿名函数中可用,您需要使用use"传递它"。$d将是父目录,$f将是该目录中的一个条目。

参见参考资料:什么是变量作用域,哪些变量可以从哪里访问,什么是"未定义的变量";错误吗?

它们不一样:

$d -是你传递给scandir_nofolders作为参数的目录(在你的例子中是'/xampp'

)

$f -是该目录(文件、目录、目录)中的单个项。或者. .)

要进行检查,只需在函数中添加echo:

function scandir_nofolders($d) {
    return array_filter(scandir($d), function ($f) use($d) {
       echo $d.' '.$f."<br />";
       return ! is_dir($d . "/" . $f);
   });
}

,你会看到不同。

在闭包中,闭包参数是你想要进行操作的元素(例如排序,或者在你的情况下显示/检查项目),在use中,你可以添加其他变量,因为在你的情况下,你需要传递那些项目(文件)放置的目录,使用is_dir函数

进行检查