【问题标题】:Auto include/require all files under all directories自动包含/要求所有目录下的所有文件
【发布时间】:2014-08-16 11:45:17
【问题描述】:

我想自动include/require所有目录下的所有.php文件。例如:

(目录结构)

-[ classes
    --[ loader (directory)
        ---[ plugin.class.php
    --[ main.class.php
    --[ database.class.php

我需要一个自动加载所有以.php结尾的文件的函数

我已经尝试了各种方法:

$scan = scandir('classes/');
foreach ($scan as $class) {
    if (strpos($class, '.class.php') !== false) {
        include($scan . $class);
    }
}

【问题讨论】:

  • 为什么不起作用?它说什么?确保 error_reportingdisplay_errors 已打开。
  • 它只是给了我未定义的变量,这意味着它没有加载类。
  • include('classes/'.$class);替换include($scan . $class);

标签: php autoloader


【解决方案1】:

好吧,如果你想在子目录中包含所有具有特定结尾的 php 文件,你必须创建一个递归函数。像这样的:

function load_classphp($directory) {
    if(is_dir($directory)) {
        $scan = scandir($directory);
        unset($scan[0], $scan[1]); //unset . and ..
        foreach($scan as $file) {
            if(is_dir($directory."/".$file)) {
                load_classphp($directory."/".$file);
            } else {
                if(strpos($file, '.class.php') !== false) {
                    include_once($directory."/".$file);
                }
            }
        }
    }
}

load_classphp('./classes');

【讨论】:

  • 天啊unset()...如果你不想要...,不要问他们。了解 scandir() 的作用及其竞争对手,例如 glob()
  • 我可以看到它的作用。是 6 点。但这仍然很讨厌,并且有些功能可以满足您的要求。 glob() 不带模式,返回所有文件和文件夹,... 除外。还有更多功能可以完全满足您的需求。
  • 谢谢这个代码 sn-p 完成了几个小时修补 glob 和自动加载的工作。
  • @lindsaymacvean glob 也可以使用递归函数(例如 stackoverflow.com/questions/39192691/… - 您可以循环遍历结果(但您也可以修改函数以直接包含文件))。
【解决方案2】:

这可能是递归查找模式文件的最简单方法:

$dir = new RecursiveDirectoryIterator('classes/');
$iter = new RecursiveIteratorIterator($dir);
$files = new RegexIterator($iter, '/^.+\.class\.php$/', RecursiveRegexIterator::GET_MATCH); // an Iterator, not an array

foreach ( $files as $file ) {
  include $file; // $file includes `classes/`
}

RecursiveDirectoryIterator 是一个狡猾的野兽,所以了解它可能是不可行的。互联网有许多具体的例子。诀窍是搜索它。

【讨论】:

    【解决方案3】:
    function autoload( $path ) {
        $items = glob( $path . DIRECTORY_SEPARATOR . "*" );
    
        foreach( $items as $item ) {
            $isPhp = pathinfo( $item )["extension"] === "php";
    
            if ( is_file( $item ) && $isPhp ) {
                require_once $item;
            } elseif ( is_dir( $item ) ) {
                autoload( $item );
            }
        }
    }
    
    autoload( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . "classes" );
    

    【讨论】:

      【解决方案4】:
      $dir = new RecursiveDirectoryIterator('将此更改为您的自定义根目录'); foreach (new RecursiveIteratorIterator($dir) as $file) { if (!is_dir($file)) { if( fnmatch('*.php', $file) ) // 您可以将文件扩展名更改为您需要的任何扩展名。 /* 在这里做任何事情 */ } }

      【讨论】:

        【解决方案5】:

        如果你要包含的php文件是PHP类,那么你应该使用PHP Autoloader

        将所有 php 文件自动包含在所有目录中并不是一个安全的做法。如果包含不必要的文件,性能可能会下降。

        这是应该可以工作的代码(我没有测试过):

        $scan = scandir('classes/');
        foreach ($scan as $class) {
          if (strpos($class, '.class.php') !== false) {
            include('classes/' . $class);
          }
        }
        

        如果你想递归包含RecursiveIteratorIterator will help you

        【讨论】:

          【解决方案6】:

          一种简单的方法:使用RecursiveDirectoryIterator 而不是glob() 的简单函数。

          function include_dir_r( $dir_path ) {
              $path = realpath( $dir_path );
              $objects = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator( $path ), \RecursiveIteratorIterator::SELF_FIRST );
              foreach( $objects as $name => $object ) {
                  if( $object->getFilename() !== "." && $object->getFilename() !== ".." ) {
                      if( !is_dir( $name ) ){
                          include_once $name;
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-03-04
            • 2021-01-05
            • 2013-12-31
            • 1970-01-01
            • 2021-07-02
            • 1970-01-01
            • 2021-04-18
            • 2010-10-10
            相关资源
            最近更新 更多