PHP: Рекурсивное дерево файлов с маской на практике

Если мы решили красиво все писать, то классы лучше хранить в разных файлах, один класс = один файл. Для того, чтобы автоматически подключать модули, легче сделать перебор внутри главного класса, примером использования является сборка всех js файлов из папок модулей

<head>
        <?php
	$files_js = listFromDir(__DIR__ . DIRECTORY_SEPARATOR . 'common' . DIRECTORY_SEPARATOR . 'js', '|(.*)js$|i', true);
	foreach($files_js AS $file => $full) {
		echo '<script src="common/js/' . $file . '"></script>';
	}
	$files_js = listFromDir(__DIR__ . DIRECTORY_SEPARATOR . 'modules', '|(.*)js$|i', true);
	foreach($files_js AS $file => $full) {
		echo '<script src="modules/' . $file . '"></script>';
	}
	?>
</head>

Рекурсия не так страшна, как кажется. Но есть еще отличные, замечательные вещи, которые позволяют делать рекурсию без рекурсии штатными средствами php, и это отличный пример использования RecursiveDirectoryIterator. При поиске имен классов (параметр три) мы подразумеваем, что файлы называются от имени класса, так класс class MyClass будет в файле MyClass.php, а класс MyNamespace/MyClass.php в файле с названием MyClass.php в папке MyNamespace

function listFromDir($path, $regular_expression = '/^.+\.php$/i', $find_classes = true)
{
	if (!is_dir($path)) {
		return array();
	}
	$directory  = new \RecursiveDirectoryIterator($path);
	$iterator   = new \RecursiveIteratorIterator($directory);
	$array      = new \RegexIterator($iterator, $regular_expression, \RecursiveRegexIterator::GET_MATCH);
	$result     = array();
	if ($find_classes) {
		foreach($array AS $row) {
			$class = str_replace($path . DIRECTORY_SEPARATOR, '', $row[0]);
			if (DIRECTORY_SEPARATOR != '/') {
				$class = str_replace(DIRECTORY_SEPARATOR, '/', $class);
			}
			$result[$class] = $row[0];
		}
	} else {
		foreach($array AS $row) {
			$result[] = $row[0];
		}
	}
	ksort($result);
	return $result;
}

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">