如何包含目录中的所有PHP文件?


230

在PHP中可以包含脚本目录吗?

即代替:

include('classes/Class1.php');
include('classes/Class2.php');

是否有类似的东西:

include('classes/*');

似乎找不到找到包括特定类的大约10个子类的集合的好方法。

Answers:


437
foreach (glob("classes/*.php") as $filename)
{
    include $filename;
}

4
我以为使用include()会更干净。但这会很好。感谢大家。
occhiso

5
我将使用配置文件构建适当的模块系统,但这只是因为我发现它比仅包含所有内容都更加灵活。:-)
staticsan

3
注意,仅适用于将文件包含在当前目录中。可以通过get_include_path()进行迭代,但这很快就会变得乏味。
2011年

20
当需要扩展基类的类时,此方法不好:例如,如果BaseClass出现在AFTER ExtendedClass数组中,它将无法工作!
2013年

2
@nalply get_include_path()仍无法自动确定加载顺序(基类可能在扩展类加载后,导致错误)
Raptor

50

这是我在PHP 5中从多个文件夹中包含许多类的方式。但这仅在您具有类的情况下才有效。

/*Directories that contain classes*/
$classesDir = array (
    ROOT_DIR.'classes/',
    ROOT_DIR.'firephp/',
    ROOT_DIR.'includes/'
);
function __autoload($class_name) {
    global $classesDir;
    foreach ($classesDir as $directory) {
        if (file_exists($directory . $class_name . '.php')) {
            require_once ($directory . $class_name . '.php');
            return;
        }
    }
}

3
自动加载无关紧要,因为这个问题是关于将目录中的所有内容都包含在内的-通常这将位于不同的目录中:例如,在BE目录中定义的DataClass和在BL目录中定义的BL.class.php。
卡马吉登(Camageddon)

1
使用全局变量不是解决方案
Peter

我建议使用composer(getcomposer.org),如果您需要自动加载而不是此处显示的自定义自动加载解决方案。
凯尔特(Kelt),

32

我意识到这是一个较旧的文章,但是...不要包含您的课程...而是使用__autoload

function __autoload($class_name) {
    require_once('classes/'.$class_name.'.class.php');
}

$user = new User();

然后,每当您调用一个尚未包含的新类时,php就会自动触发__autoload并为您包括它


1
尽管这是发布时的可靠答案,但自PHP7.2.0起,此方法已被弃用,不应使用。而是使用spl_autoload_register
Frozenjakalope

1
如果目的是包括CLASSES,这是一个更好的答案。
Blackbam


20

这只是对Karsten代码的修改

function include_all_php($folder){
    foreach (glob("{$folder}/*.php") as $filename)
    {
        include $filename;
    }
}

include_all_php("my_classes");

12
这不会添加与已接受答案相关的任何内容。
moopet

谢谢,这是唯一出于某种原因实际起作用的代码。
约瑟夫·阿斯特拉罕'02

19

2017年如何做:

spl_autoload_register( function ($class_name) {
    $CLASSES_DIR = __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR;  // or whatever your directory is
    $file = $CLASSES_DIR . $class_name . '.php';
    if( file_exists( $file ) ) include $file;  // only include if file exists, otherwise we might enter some conflicts with other pieces of code which are also using the spl_autoload_register function
} );

PHP文档在此推荐:自动加载类


这不会回答任何问题,因为autoload只有在有人尝试创建尚未加载的类的对象时,它才会起作用。
教父


1

如果要在目录及其子目录中包含所有内容:

$dir = "classes/";
$dh  = opendir($dir);
$dir_list = array($dir);
while (false !== ($filename = readdir($dh))) {
    if($filename!="."&&$filename!=".."&&is_dir($dir.$filename))
        array_push($dir_list, $dir.$filename."/");
}
foreach ($dir_list as $dir) {
    foreach (glob($dir."*.php") as $filename)
        require_once $filename;
}

不要忘记,它将使用字母顺序包括您的文件。


3
“不要忘了,它会使用字母顺序”错误的... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
NemoStein

1
如果文件相互依赖并且顺序与依赖关系不匹配,这可能行不通
Amanuel Nega's

1

如果您希望包含一堆类而不必一次定义每个类,则可以使用:

$directories = array(
            'system/',
            'system/db/',
            'system/common/'
);
foreach ($directories as $directory) {
    foreach(glob($directory . "*.php") as $class) {
        include_once $class;
    }
}

这样,您可以只在包含该类而不是完整列表的php文件上定义该类 $thisclass = new thisclass();

至于如何处理所有文件?我不确定此速度可能会略有下降。


1

如果文件之间没有依赖关系...这是一个递归函数,可将ALL子目录中的所有php文件include_once包括在内:

$paths = array();

function include_recursive( $path, $debug=false){
  foreach( glob( "$path/*") as $filename){        
    if( strpos( $filename, '.php') !== FALSE){ 
       # php files:
       include_once $filename;
       if( $debug) echo "<!-- included: $filename -->\n";
    } else { # dirs
       $paths[] = $filename; 
    }
  }
  # Time to process the dirs:
  for( $i=count($paths)-1; $i>0; $i--){
    $path = $paths[$i];
    unset( $paths[$i]);
    include_recursive( $path);
  }
}

include_recursive( "tree_to_include");
# or... to view debug in page source:
include_recursive( "tree_to_include", 'debug');

1
<?php
//Loading all php files into of functions/ folder 

$folder =   "./functions/"; 
$files = glob($folder."*.php"); // return array files

 foreach($files as $phpFile){   
     require_once("$phpFile"); 
}

请为您的代码添加更多说明,尤其是因为这个问题已经得到很多支持的答案
Nico Haase


-1

不要编写一个function()将文件包含在目录中。您可能会丢失变量作用域,并且可能必须使用“全局”。只是循环文件。

同样,当包含的文件具有将扩展到另一个文件中定义的另一个类的类名时,您可能会遇到麻烦-尚未包含。所以,要小心。


2
“失去可变范围”是什么意思?
piyush 2012年

3
如果要重用,或者只是为了使代码更具“自我说明性”,就应该始终使用函数。我认为“全球范围”问题是一个红场。每当使用“全局范围”时,您都需要认真考虑重写代码以避免这种情况。
斯塔夫·埃斯库拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.