PHP use()函数在这种情况下

时间:2014-07-16 13:18:33

标签: php closures scandir

我正在尝试遍历目录,只显示文件,没有文件夹。我在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()功能的真正目的被误解了。

2 个答案:

答案 0 :(得分:0)

它们不一样:

$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函数

进行检查

答案 1 :(得分:0)

如果你碰巧知道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将成为该目录中的条目。

另见Reference: What is variable scope, which variables are accessible from where and what are "undefined variable" errors?