2009-03-01 112 views
190

非常快速的n00b問題,在PHP中我可以包含一個腳本目錄。如何包含()目錄中的所有PHP文件?

即相反的:

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

有一樣的東西:

include('classes/*'); 

可能似乎無法找到包括約10個亞類的集合特定類的好方法。

回答

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

我以爲會有一個使用include()更清晰的方式。 但這會做得很好。感謝大家。 – occhiso 2009-03-01 11:46:52

+5

我會用一個配置文件構建一個合適的模塊系統,但那只是因爲我發現比只包含* everything *更靈活。 :-) – staticsan 2009-03-02 00:01:19

+3

注意,只適用於在當前目錄中包含文件。可以遍歷get_include_path(),但這很快就會變得乏味。 – nalply 2011-11-18 11:13:23

0

我建議您使用readdir()函數,然後循環幷包含這些文件(請參閱該頁面上的第一個示例)。

18

如果您使用的是PHP 5,則可能需要使用autoload

49

這是我在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; 
     } 
    } 
} 
19

這僅僅是一個Karsten的代碼修改

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

include_all_php("my_classes"); 
-2

做沒有寫一個函數(),包括文件在目錄中。您可能會丟失變量作用域,可能必須使用「全局」。只是循環上的文件。

此外,當包含的文件具有擴展到另一個文件中定義的另一個類的類名時,可能會遇到困難 - 尚未包含該類。所以,小心點。

26

我意識到這是一個老的文章,但...不包括你的類...而是使用__autoload

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

$user = new User(); 

然後當你調用未包括但PHP將一個新的類火災自動__autoload,包括爲你

0

如果您尋找包括一堆類而不必一次你可以用它來定義每個等級:

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

這種方式可以Ĵ ust在包含類的php文件中定義類,而不是整個列表$thisclass = new thisclass();

至於它如何處理所有文件?我不確定可能會有這樣的速度下降。

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; 
} 

不要忘了,它會用字母順序排列,包括您的文件。

11

如何做到這一點在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文件位置:Autoloading classes

1

如果有沒有相關文件之間 ...這裏是一個遞歸函數include_once在所有subdirs的所有php文件:

$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'); 
相關問題