自动包含/要求所有目录下的所有文件

时间:2014-08-16 11:45:17

标签: php autoloader

我想在所有目录下自动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);
    }
}

6 个答案:

答案 0 :(得分:5)

好吧,如果你想要包含所有具有特定结尾的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');

答案 1 :(得分:1)

如果要包含的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

答案 2 :(得分:1)

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

$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 :(得分:1)

$dir = new RecursiveDirectoryIterator('change this to your custom root directory');
foreach (new RecursiveIteratorIterator($dir) as $file) {
    if (!is_dir($file)) {
        if( fnmatch('*.php', $file) ) // you can change the file extension to any that you require.
        /* do anything here */
    }
}

答案 4 :(得分:1)

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" );

答案 5 :(得分:0)

一种简单的方法:使用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;
            }
        }
    }
}