Php Foreach glob在子目录中包含文件

Php Foreach glob在子目录中包含文件,php,include,foreach,glob,Php,Include,Foreach,Glob,我正在尝试学习如何使用glob()将所有文件包含在一个目录中,但是我似乎无法让它工作。这是我现在拥有的代码: foreach (glob("addons/*.php") as $filename) { include $filename; } 但是,单个文件include似乎可以正常工作: include "addons/hello.php"; 这就是我的文件结构的外观: 主题 -插件 --hello.php -index.php -options.php 所以我不确定问题出在哪里。代码位于

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

foreach (glob("addons/*.php") as $filename) {
include $filename;
}
但是,单个文件include似乎可以正常工作:

include "addons/hello.php";
这就是我的文件结构的外观:

主题

-插件

--hello.php

-index.php

-options.php


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

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

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

$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 />';
     }
};
$dir=getcwd()//可以替换为您的本地路径
foreach(glob(“{$dir}/addons/*.php”)作为$filename){
如果(文件_存在($filename))
{
//文件存在,我们可以包含它
包括$filename;
}
其他的
{
回显'File'.$filename'。未找到
; } };
确保文件的路径是绝对路径(从服务器的根目录)

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

$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 />';
     }
};
$dir=getcwd()//可以替换为您的本地路径
foreach(glob(“{$dir}/addons/*.php”)作为$filename){
如果(文件_存在($filename))
{
//文件存在,我们可以包含它
包括$filename;
}
其他的
{
回显'File'.$filename'。未找到
; } };
Include将使用搜索路径,该路径(通常包括当前工作目录)不限于此。。。使用具有相对目录路径的glob()将始终相对于当前工作目录。在你进入循环之前。。。确保当前工作目录是您认为它正在使用echo getcwd()的位置。。。您可能会发现,您毕竟不在主题子目录中;但是主题子目录在搜索路径中。

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

使用此选项进行测试:

foreach (glob("addons/*.php", GLOB_NOCHECK) as $filename) {
    PRINT $filename . "\n";
}
如果该目录相对于当前目录不存在,那么它将显示
插件/*.php
作为输出。

使用该目录进行测试:

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

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

此递归函数应实现以下功能:

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
部分。

此递归函数应能实现以下功能:

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
部分。

如果您
echo$filename,您会得到什么?确保在包含路径中可以找到
$filename
。如果使用
打印
代替
包含
,它会给出预期的文件列表吗?回送看起来也没有任何作用。@Gordon-这不是Glob应该做的吗?我尝试使用相同的路径结构只包含一个文件,它在没有glob的情况下工作?确保在包含路径中可以找到
$filename
。如果使用
打印
代替
包含
,它会给出预期的文件列表吗?回送看起来也没有任何作用。@Gordon-这不是Glob应该做的吗?我尝试使用相同的路径结构只包含一个文件,这在没有glob的情况下工作。我不会依赖相对路径,因为它很容易把事情搞砸。我想这就是我想说的。。。只有在正确的位置,相对路径才有效。在这种情况下,我不认为OP是他认为的那样。我不会依赖相对路径,因为它很容易把事情搞砸。我想这就是我想说的。。。只有在正确的位置,相对路径才有效。在这种情况下,我不认为OP是他认为他在的地方。在我这方面,它只是生成了一个列表,列出了我的管理文件夹下的所有文件。没错,这表明glob按预期工作。现在,您可以设置addons文件夹的路径,而不是$dir变量,也不用显示$filename,而是使用include。我不知道为什么,因为我使用的是一个绝对路径。在我这方面,它只是生成了一个列表,列出了我的管理文件夹下的所有文件。这是正确的,这表明glob正在按预期工作。现在,您可以设置addons文件夹的路径,而不是$dir变量,也不用显示$filename,而是使用include。不知道为什么,因为我使用的是绝对路径。是的,它在顶部输出“addons/*.php”。@James:那么试试
glob(“./addons/*.php”)
,但你肯定是在错误的目录中。好的,我现在知道了。我终于找到了足够多的文件夹。我不知道哪一个是CWD,因为它们是内容文件夹的一部分。谢谢大家的帮助。是的,它在顶部输出“addons/*.php”。@James:那么试试
glob(“./addons/*.php”)
,但你肯定是在错误的目录中。好的,我现在知道了。我终于找到了足够多的文件夹。我不知道哪一个是CWD,因为它们是内容文件夹的一部分。谢谢大家的帮助。