Автоматически включать / требовать все файлы во всех каталогах
Я хотел бы автоматически 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».