【问题标题】:Foreach glob to include files in a subdirectoryForeach glob 将文件包含在子目录中
【发布时间】:2026-02-14 11:00:01
【问题描述】:

我正在尝试学习如何使用 glob() 将所有文件包含在一个目录中,但是我似乎无法让它工作。这是我现在的代码:

foreach (glob("addons/*.php") as $filename) {
include $filename;
}

然而,单个文件包含似乎工作得很好:

include "addons/hello.php";

这是我的文件结构:

主题

-插件

--hello.php

-index.php

-options.php

所以我不确定问题出在哪里。代码位于(主题)子目录本身内,如果这有什么不同的话。谢谢。

【问题讨论】:

  • echo $filename; 会得到什么?
  • 确保 $filename 在您的包含路径中可以找到。
  • 如果您使用print 代替include,它会给出预期的文件列表吗?
  • 回声似乎也没有任何作用。
  • @Gordon - 这不是 Glob 应该做的吗?我尝试使用相同的路径结构来仅包含一个文件,该文件不使用 glob。

标签: php include foreach glob


【解决方案1】:

将此用于测试:

foreach (glob("addons/*.php", GLOB_NOCHECK) as $filename) {
    PRINT $filename . "\n";
}

如果该目录相对于当前不存在,那么它将显示addons/*.php作为输出。

【讨论】:

  • 是的,它在顶部输出“addons/*.php”。
  • @James:然后试试glob("./addons/*.php"),但你肯定是在错误的目录中。
  • 好的,我现在知道了。我终于回到了足够的文件夹。我不知道哪个是 CWD,因为它们是内容文件夹的一部分。感谢大家的帮助。
【解决方案2】:

这个递归函数应该可以解决问题:

function recursiveGlob($dir, $ext) {
    $globFiles = glob("$dir/*.$ext");
    $globDirs  = glob("$dir/*", GLOB_ONLYDIR);

    foreach ($globDirs as $dir) {
        recursiveGlob($dir, $ext);
    }

    foreach ($globFiles as $file) {
        include $file;
    }
}

用法:recursiveGlob('C:\Some\Dir', 'php');

如果您希望它对单个文件执行其他操作,只需替换 include $file 部分即可。

【讨论】:

    【解决方案3】:

    Include 将使用搜索路径(虽然它通常包括当前工作目录)不限于此...使用带有相对目录路径的 glob() 将始终相对于当前工作目录.在进入循环之前...确保您当前的工作目录是您认为它正在使用的位置 echo getcwd()...您可能会发现您毕竟不在 Theme 子目录中;但主题子目录在搜索路径中。

    【讨论】:

    • 我不会依赖相对路径,因为它很容易搞砸
    • 我想这就是我想说的......相对路径只有在你在正确的地方时才有效。在这种情况下,我认为 OP 并不是他认为的位置。
    【解决方案4】:

    确保文件的路径是绝对路径(从服务器的根目录开始)。

    在我的例子中,这个例子没有问题:

    $dir = getcwd();//can be replaced with your local path
    
    foreach (glob("{$dir}/addons/*.php") as $filename) {
         if(file_exists($filename))
         {
             //file exists, we can include it
             include $filename;
         }
         else
         {
             echo 'File ' . $filename . ' not found<br />';
         }
    };
    

    【讨论】:

    • 在我这边,它只是生成了我的管理文件夹下所有文件的列表。
    • 没错,这表明 glob 正在按预期工作。现在您可以设置插件文件夹的路径而不是 $dir 变量,而不是显示 $filename 使用 include。
    • 还是说没有这个文件或目录。不知道为什么,因为我使用的是绝对路径。