【问题标题】:How to include specific filename from multiple directories using PHP如何使用 PHP 包含来自多个目录的特定文件名
【发布时间】:2009-12-05 02:21:30
【问题描述】:

我正在尝试在文件夹结构中包含特定的“管理视图”文件。我熟悉 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

如您所见,递归地包含文件是行不通的,手动包含它们可以正常工作,.. 直到我们开始从主“类型”文件夹中添加和删除目录.. 然后,我们必须手动编辑所有包含代码.. 所以,我希望找到一个函数,或者 sn-p,它可以让我查看所有具有“类型”目录的目录,并且只包含一个特定的文件名 (admin_view.php)

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

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

);
$view_name = "admin_view.php";

function __autoload($view_name) {
    global $modulesDir;
    foreach ($modulesDir as $directory) {
        if (file_exists($directory . $view_name)) {
                require_once ($directory . $view_name);
                return;
        }
    }
}

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

编辑:

我能够用这个加载视图文件。但我觉得有更好的方法来做到这一点:

澄清

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

【问题讨论】:

  • 好吧,我相信您的解决方案已经足够好了 :) 实际上比其他建议更简单。除非您对此有任何具体问题,否则应该没问题。
  • 好的..如果你看不到任何其他(阅读:更好)的方式来做到这一点并且现在的方式没有问题..我将继续使用我弗兰肯斯坦的版本.. 谢谢!

标签: php include filenames


【解决方案1】:

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

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

if (file_exists($directory . $view_name)) { ... }

$modulesDir 中的文件夹名称不会以 / 结尾

当您执行file_exists($directory . $view_name) 时,实际上是在检查一个名为

的文件
ROOT_DIR.'mods/typeadmin_view.php'

不是你想要的

ROOT_DIR.'mods/type/admin_view.php'

编辑:

关于__autoload($name)的使用,要记住的一点是:

来自PHP Documentation: Autoloading Classes

你可以定义一个 __autoload 函数 以防万一会自动调用 您正在尝试使用 没有的类/接口 尚未定义。

这意味着如果你没有使用类,或者你正在使用的类已经被“包含”了,它就不会被调用。

根据您的问题,乍一看并不清楚您是否使用类,即使看起来您使用 __autoload() 不合适。

无论如何,您使用glob("/path/*/file.php") 的方法似乎不错。
它简单、清晰,可以完成工作。
除非您发现它有特定的问题,否则您应该很高兴。

【讨论】:

  • 如果他回答了你的问题,请点击复选标记,这样他就可以得到认可!
  • 这绝对是需要的更正。但是从我正在阅读的内容来看,我应该使用 __autoload 以外的东西将特定的 php 文件加载到另一个文件中......但是非常感谢这个问题!
  • 随意“接受”您认为解决了您的问题的答案(或者如果您认为他们都没有这样做,则根本没有答案)。但作为一般规则,请对您认为有帮助的所有答案投赞成票。您不仅应该对您的问题投赞成票,而且在您搜索问题并找到有用的答案的任何时候都应该投赞成票。这就是 StackOverflow 对答案进行排序以及对那些花时间提供帮助的人给予奖励的方式。无论如何,希望你能解决你的问题! :)
  • @Carlos... 我试图为那些有帮助的人投票。但它说我需要 15 的声誉才能这样做.. :-/ 这里的每个人都非常有帮助,我很感谢所有的反馈。希望很快我就能展示出来,因为我的代表超过 15 岁。
  • 确实如此。我忘记了。我第一次在这里回答问题时,由于声誉限制,我什至无法将链接放在答案上。 :)
【解决方案2】:

您可以使用 SPL 的 RecursiveDirectoryIterator 遍历目录及其子目录中的所有文件。
然后,您可以使用扩展 FilterIterator 的类将结果限制为特定文件。

例如

<?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;
}

【讨论】:

    【解决方案3】:

    __autoload 用于自动加载类包含。

    这意味着每次你创建一个 PHP 还不知道定义的类的新实例时,PHP 将调用 __autoload 函数并希望将类定义包含在内。

    我没有看到任何代码在您的代码中创建对象,如果您查看__autoload 的 PHP,他们提供了此示例。

    <?php
    function __autoload($class_name) {
        require_once $class_name . '.php';
    }
    
    $obj  = new MyClass1();
    $obj2 = new MyClass2(); 
    ?>
    

    如果您希望在创建控制器对象时包含视图,这样的东西应该可以工作,您的控制器必须命名为 foobarController 才能正常工作。

    $modulesDir = array (
        ROOT_DIR.'mods/type',
    
    );
    $view_name = "admin_view.php";
    
    function __autoload($class_name) {
        global $modulesDir;
        if(preg_match('/(\w+)Controller/', $class_name, $match)){
          $class = $match[1];
          // TODO: include the class definition
          // require CONTROLLER_DIR . $class_name . '.php';
          foreach ($modulesDir as $directory) {
            if (file_exists($directory . strtolower($class) . '_view.php')) {
                    require_once ($directory . strtolower($class) . '_view.php');
                    return;
            }
          }
        }
    }
    
    $adminController = new AdminController();
    

    【讨论】:

    • 是的,但是您的视图不是正确的类,那么为什么要使用 __autoload
    猜你喜欢
    • 2017-09-29
    • 2013-05-03
    • 2011-11-14
    • 1970-01-01
    • 2014-01-13
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多