如何使用PHP包含来自多个目录的特定文件名

如何使用PHP包含来自多个目录的特定文件名,php,include,filenames,Php,Include,Filenames,我试图在文件夹结构中包含特定的“管理视图”文件。我熟悉include/require或如何递归地包含文件夹,但我需要做的只是从每个目录中包含一个文件名——admin_view.php文件 所以,我的主任。结构如下所示: 要包含的文件位于根目录下 - mods - type -- type1 -admin_view.php -other files I do not need included -- type2 -admin_view

我试图在文件夹结构中包含特定的“管理视图”文件。我熟悉include/require或如何递归地包含文件夹,但我需要做的只是从每个目录中包含一个文件名——admin_view.php文件

所以,我的主任。结构如下所示:

要包含的文件位于根目录下

 - mods
  - type
    -- type1
       -admin_view.php
       -other files I do not need included
    -- type2
       -admin_view.php
       -other files I do not need included
    -- type3
       -admin_view.php
       -other files I do not need included
正如您所看到的,递归地包含这些文件是行不通的,而手动地包含这些文件是行不通的,。。直到我们开始从主“type”文件夹添加和删除目录。。然后,我们必须手动编辑所有包含代码。。因此,我希望找到一个函数或代码段,它允许我查看所有带有“type”目录的目录,并且只包含一个特定的文件名(admin_view.php)

这是我到目前为止拼凑的,但它不起作用…:(

非常感谢!这个地方是一个很棒的资源。我真的很感谢它为开发社区提供的所有知识、更正、澄清等! J

编辑:

我可以用这个加载视图文件,但我觉得有更好的方法:

澄清

我误用了uu autoload函数..因为我没有加载类..只加载要包含在主文档中的php文件…很抱歉,我正在学习:)

用于自动加载类包含

这意味着每当您创建一个PHP还不知道定义的类的新实例时,PHP都会调用
\uu autoload
函数并希望包含该类定义

我没有看到任何代码在您的代码中创建对象,如果您看看
\uuu autoload
的PHP,它们提供了这个示例

<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

不确定这是否是代码中唯一的问题,但请检查以下内容:

$modulesDir = array (
    ROOT_DIR.'mods/type',
);

if (file_exists($directory . $view_name)) { ... }
您在
$modulesDir
中的文件夹名不能以
/
结尾

当您确认文件存在($directory.$view\u name)时,实际上是在检查名为

ROOT_DIR.'mods/typeadmin_view.php'
而不是你想要的

ROOT_DIR.'mods/type/admin_view.php'
编辑: 关于使用自动加载($name),需要记住的一点是:

发件人:

您可以定义一个自动加载函数 在这种情况下会自动调用 您正在尝试使用 类/接口,该类/接口尚未 还没有定义

这意味着,如果您没有使用类,或者您正在使用的类已经“包含”,则不会调用它

从您的问题来看,乍一看您是否在使用类并不清楚,即使您使用的
\uu autoload()
看起来不合适

无论如何,您使用
glob(“/path/*/file.php”)
的方法看起来不错。
它简单明了,可以完成任务。
除非您发现它有特定的问题,否则您应该可以使用它。

您可以使用SPL对目录及其子目录中的所有文件进行迭代。
然后,可以使用类扩展将结果限制为特定文件

e、 g


是的,但是你的观点并不正确,那么为什么要使用
\uu autoload
?我相信你的解决方案已经足够好了:)实际上比其他建议更简单。除非你有什么特别的问题,否则你应该没事的。。如果你看不到任何其他(阅读:更好)的方法,而且现在的方式没有问题。。我会继续我的弗兰肯斯坦版本。。谢谢如果他回答了你的问题,请单击复选标记,这样他就可以获得学分!这绝对是一个需要纠正的问题,。然而,从我所阅读的内容来看,我应该使用除自动加载以外的其他方法将特定的php文件加载到另一个。。。但是,我们非常感谢您的捕获!自由地“接受”你认为解决了你的问题的答案(或者如果你认为他们中没有一个解决了问题,那么根本就没有答案)。但一般来说,放弃对所有你认为有用的答案的投票。你应该放弃投票,不仅是在你的问题上,而且是在任何时候你寻找一个问题并找到一个有用的答案。这就是StackOverflow如何对答案进行排序,以及为那些花时间帮助的人提供积分。不管怎样,希望你解决了你的问题!:)@卡洛斯。。。我试着胜过那些有帮助的人。。但它说我需要15岁的声誉才能做到这一点这里的每个人都非常乐于助人,我非常感谢所有的反馈。。希望很快我就能表现出来,因为我的代表超过了15岁。真的。我忘了。第一次在这里回答问题时,由于声誉限制,我甚至无法在答案上添加链接。:)
ROOT_DIR.'mods/typeadmin_view.php'
ROOT_DIR.'mods/type/admin_view.php'
<?php
class EndsWithFilterIterator extends FilterIterator {
  protected $s;
  public function __construct($s, $it) {
    parent::__construct($it);
    $this->s = $s;
  }

  public function accept() {
    $c = parent::current();
    return false!==stripos($c, $this->s, strlen($c)-strlen($this->s));
  }
}


$directory = 'type/';
$it = new EndsWithFilterIterator('admin_view.php',
  new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory))
);
foreach($it as $f) {
  echo $f, "\n";
  // require_once $f;
}