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