自动包含/引入所有目录下的所有文件

4
我希望能够自动包含/引用所有目录下的.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);
    }
}

1
为什么没有作用?它说了什么?确保 error_reportingdisplay_errors 是开启的。 - Rudie
它只是给我未定义的变量,这意味着它没有加载该类。 - Adam W
include($scan . $class); 替换为 include('classes/'.$class); - Charlotte Dunois
8个回答

8

如果您想包含所有带有特定结尾的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');

5
天啊,unset()......如果你不想要...,就不要请求它们。学习一下scandir()以及与之竞争的函数,比如glob() - Rudie
我可以看到它的功能。只有6行代码。但是它仍然很糟糕,而且有一些函数可以实现你想要的功能。使用没有模式的glob()函数,可以返回除了“.”和“..”之外的所有文件和文件夹。还有更多的函数可以完全满足你的需求。 - Rudie
谢谢,这段代码片段解决了我几个小时的尝试使用glob和autoload都无法解决的问题。 - lindsaymacvean
@lindsaymacvean glob也可以工作,同样使用递归函数(像这个 https://stackoverflow.com/questions/39192691/browse-directory-recursively-and-get-files-name/39192868#39192868 - 然后你可以循环遍历结果(但你也可以修改函数直接包含文件))。 - Charlotte Dunois

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 是一个棘手的东西,所以完全了解它可能是不可行的。但是互联网上有很多具体的例子。诀窍就在于搜索。


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

1
如果你想要包含的PHP文件是PHP类文件,那么你应该使用PHP自动加载器
自动包含所有目录中的PHP文件并不是一种安全的做法。如果包含了不必要的文件,性能可能会受到影响。
以下是应该可行的代码(我没有测试过):
$scan = scandir('classes/');
foreach ($scan as $class) {
  if (strpos($class, '.class.php') !== false) {
    include('classes/' . $class);
  }
}

如果您想进行递归包含,RecursiveIteratorIterator将会对您有所帮助

1
$dir = new RecursiveDirectoryIterator('将此更改为您的自定义根目录');
foreach (new RecursiveIteratorIterator($dir) as $file) {
    if (!is_dir($file)) {
        if( fnmatch('*.php', $file) ) // 您可以将文件扩展名更改为任何所需的扩展名。
        /* 在此处执行任何操作 */
    }
}

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

0

我使用的一个是

function fileLoader($dir) {
    $files = scandir($dir);
    foreach ($files as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
            __DIR__.$path;
        } else {
            require_once $path;
        }
    }
}

# calling the function
fileLoader('mydirectory')

0
这个案例对我有用。
private static function includeFolderRecursivly( $directory ) {
    $platforms = scandir( $directory );
    $platforms = array_diff( $platforms, array( '.', '..' ) );
    foreach ( $platforms as $item ) {
        if ( isset ( pathinfo( $item )['extension'] ) && pathinfo( $item )['extension'] == 'php') {
            require_once $directory . pathinfo( $item )['basename'];
        } else {
            self::includeFolderRecursivly( $directory . pathinfo( $item )['basename'].'/' );
        }
    }
}

只包括扩展名为'.php'的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接