【问题标题】:Require all files in a folder要求文件夹中的所有文件
【发布时间】:2011-02-11 03:35:01
【问题描述】:

有没有简单的方法以编程方式要求文件夹中的所有文件?

【问题讨论】:

  • 这个问题已经回答了stackoverflow.com/questions/599670/…>
  • @salathe 为了回答这个问题。我只是偶然发现了同样的问题。例如,我的原因是我在它们对应的 php 文件中定义了很多 ObjectType。我有一个连接所有其他文件的单个 php 文件,我需要包含所有 ObjectTypes 才能使我的程序正常工作。另外,我的程序正在扩展。对于每个新的 ObjectType,我必须再次添加一个新行来要求它。通过这种方式,我可以确保始终需要所有 ObjectType。

标签: php


【解决方案1】:

我遇到了这个问题并修改了一些接受的答案。我的策略是将此文件放在文件夹中,然后在其他地方使用它。

<?php

// The generic "load everything in this folder except myself"

foreach (scandir(__DIR__) as $filename) {
    if (!in_array($filename, [basename(__FILE__), ".", ".."])) {
        $path = __DIR__ . DIRECTORY_SEPARATOR . $filename;
        if (is_file($path)) {
            require_once $path;
        }
    }
}

如果您有ControllersModels 之类的文件夹,这将非常有用。它允许您创建新文件而无需担心require

【讨论】:

    【解决方案2】:

    使用 opendir、readdir、closedir 的解决方案。这也包括子目录。

    <?php
    function _require_all($path, $depth=0) {
        $dirhandle = @opendir($path);
        if ($dirhandle === false) return;
        while (($file = readdir($dirhandle)) !== false) {
            if ($file !== '.' && $file !== '..') {
                $fullfile = $path . '/' . $file;
                if (is_dir($fullfile)) {
                    _require_all($fullfile, $depth+1);
                } else if (strlen($fullfile)>4 && substr($fullfile,-4) == '.php') {
                    require $fullfile;
                }
            }
        }
    
        closedir($dirhandle);
    }        
    
    //Call like
    _require_all(__DIR__ . '/../vendor/vlucas/phpdotenv/src');
    

    【讨论】:

      【解决方案3】:

      我要求所有兄弟姐妹的方式:

      <?php
      $files = glob(__DIR__ . '/*.php');
      foreach ($files as $file) {
          // prevents including file itself
          if ($file != __FILE__) {
              require($file);
          }
      }
      

      【讨论】:

        【解决方案4】:

        没有简单的方法,如在 Apache 中,您只需 Include /path/to/dir,所有文件都会包含在内。

        一种可能的方法是使用 SPL 中的 RecursiveDirectoryIterator

        function includeDir($path) {
            $dir      = new RecursiveDirectoryIterator($path);
            $iterator = new RecursiveIteratorIterator($dir);
            foreach ($iterator as $file) {
                $fname = $file->getFilename();
                if (preg_match('%\.php$%', $fname)) {
                    include($file->getPathname());
                }
            }
        }
        

        这将从$path 中提取所有.php 结束文件,无论它们在结构中有多深。

        【讨论】:

        • 应该是 if (preg_match('%\.php$%', $fname)) { include($file->getPathname()); }
        • 我真的很喜欢这个解决方案,它允许我拥有一个使用 composer 自动加载的文件夹 /classes/,以及一个同样按命名空间分组的文件夹 /functions/,但由于 composer 无法自动加载函数也不包含带有通配符的文件夹中的文件(所有文件都需要在composer.json中一一列出) - 我最终使用了这个函数。
        【解决方案5】:

        递归所有文件列表和require_once在一个目录中:

        $files = array();
        
        function require_once_dir($dir){
        
               global $files;
        
               $item = glob($dir);
        
               foreach ($item as $filename) {
        
                     if(is_dir($filename)) {
        
                          require_once_dir($filename.'/'. "*");
        
                     }elseif(is_file($filename)){
        
                          $files[] = $filename;
                     }
                }
        }
        
        $recursive_path = "path/to/dir";
        
        require_once_dir($recursive_path. "/*");
        
        for($f = 0; $f < count($files); $f++){
        
             $file = $files[$f];
        
             require_once($file);
        }
        

        【讨论】:

          【解决方案6】:

          使用foreach 循环。

          foreach (glob("classes/*") as $filename) {
            require $filename;
          }
          

          更多详情,请查看this previously posted question

          【讨论】:

          • 这是要求文件的坏方法吗?这会造成性能问题吗?
          • @Tareck117 怎么样?什么是更快的方法?
          • 我并不是说你的方法很慢,我的意思是:将文件包含在foreach(glob("folder")) VS 一个接一个地包含它们是不是很糟糕?
          • @Tareck117 别担心,Tareck,你可能是对的。 :) 只是弄清楚可以改变什么。从表面上看,我认为foreach 循环不会对性能造成很大影响。我能看到的唯一问题是文件数量是否非常大。我也很想听听其他人对此的看法。
          • 我也很想知道递归循环是否也可能是一个缓慢的过程!
          【解决方案7】:

          作为require_all()函数:

          //require all php files from a folder
          function require_all ($path) {
          
              foreach (glob($path.'*.php') as $filename) require_once $filename;
          
          }
          

          【讨论】:

          • 这是之前三个答案的副本。它所改变的只是 require_once,这不是问题的一部分。
          【解决方案8】:

          简单:

          foreach(glob("path/to/my/dir/*.php") as $file){
              require $file;
          }
          

          【讨论】:

            【解决方案9】:

            没有捷径可走,您需要在 PHP 中实现它。这样的事情就足够了:

            foreach (scandir(dirname(__FILE__)) as $filename) {
                $path = dirname(__FILE__) . '/' . $filename;
                if (is_file($path)) {
                    require $path;
                }
            }
            

            【讨论】:

            • 那特定的 sn-p 不会在无限循环中包含自身吗?另外,您可以使用__DIR__ 代替dirname(__FILE__)。但我明白了。
            • -1 因为 sn-p 包含它自己并且它不能递归地工作
            • 这里的想法很好,但是 1)它可以做得更简洁,Tom Haigh 的回答显示,2)我知道这只是一个例子,但这里的实现很难 -编码以包含当前正在运行的脚本目录中的文件有点奇怪,特别是因为当前正在运行的脚本本身没有被排除在外。如果你把它放在一个空文件夹中并运行它,它将永远包含它自己,直到它出现段错误。
            【解决方案10】:

            可能只有通过这样做:

            $files = glob($dir . '/*.php');
            
            foreach ($files as $file) {
                require($file);   
            }
            

            使用opendir()readdir() 可能比glob() 更有效。

            【讨论】:

            • @BorisŠuška:问题是“如何要求文件夹中的所有文件”。不需要递归或处理包含代码的 php 文件位于同一文件夹中的情况。
            • @BorisŠuška:如果 $dir 设置为与 DIR 相同的文件夹,则 sn-p 仅包含自身。这不是错误,sn-p 没有解决您将变量设置为的问题。
            猜你喜欢
            • 1970-01-01
            • 2013-05-25
            • 1970-01-01
            • 2011-07-18
            • 1970-01-01
            • 2016-02-26
            • 1970-01-01
            • 2020-07-02
            相关资源
            最近更新 更多