Автоматически включать / требовать все файлы во всех каталогах

Я хотел бы автоматически 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);
    }
}

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

Вероятно, это самый простой способ рекурсивного поиска шаблонных файлов:

$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 хитрый зверь, поэтому узнать все о нем, вероятно, невозможно. У паутины есть много конкретных примеров. Хитрость заключается в том, чтобы искать его.

$dir = new RecursiveDirectoryIterator("измените его на свой собственный корневой каталог");
foreach (новый RecursiveIteratorIterator($dir) как $file) {
    if (!is_dir($file)) {
        if( fnmatch('*.php', $file)) // вы можете изменить расширение файла на любое, которое вам требуется.
        /* сделать что-нибудь здесь */
    }
}

Если php-файлы, которые вы хотите включить, являются классами PHP, то вам следует использовать PHP Autoloader

Не рекомендуется автоматически включать все php-файлы во все каталоги. Производительность может снизиться, если вы добавите ненужные файлы.

Вот код, который должен работать (я его не проверял):

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

Если вы хотите рекурсивное включение, RecursiveIteratorIterator поможет вам.

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

Простой способ: простая функция с использованием 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;
            }
        }
    }
}

Тот, который я использую, это

      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')

Этот случай работает для меня.

      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».

Другие вопросы по тегам