非常快速的n00b問題,在PHP中我可以包含一個腳本目錄。如何包含()目錄中的所有PHP文件?
即相反的:
include('classes/Class1.php');
include('classes/Class2.php');
有一樣的東西:
include('classes/*');
可能似乎無法找到包括約10個亞類的集合特定類的好方法。
非常快速的n00b問題,在PHP中我可以包含一個腳本目錄。如何包含()目錄中的所有PHP文件?
即相反的:
include('classes/Class1.php');
include('classes/Class2.php');
有一樣的東西:
include('classes/*');
可能似乎無法找到包括約10個亞類的集合特定類的好方法。
foreach (glob("classes/*.php") as $filename)
{
include $filename;
}
我建議您使用readdir()函數,然後循環幷包含這些文件(請參閱該頁面上的第一個示例)。
如果您使用的是PHP 5,則可能需要使用autoload。
這是我在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;
}
}
}
這僅僅是一個Karsten的代碼修改
function include_all_php($folder){
foreach (glob("{$folder}/*.php") as $filename)
{
include $filename;
}
}
include_all_php("my_classes");
您可以使用通過set_include_path:
set_include_path('classes/');
做沒有寫一個函數(),包括文件在目錄中。您可能會丟失變量作用域,可能必須使用「全局」。只是循環上的文件。
此外,當包含的文件具有擴展到另一個文件中定義的另一個類的類名時,可能會遇到困難 - 尚未包含該類。所以,小心點。
我意識到這是一個老的文章,但...不包括你的類...而是使用__autoload
function __autoload($class_name) {
require_once('classes/'.$class_name.'.class.php');
}
$user = new User();
然後當你調用未包括但PHP將一個新的類火災自動__autoload,包括爲你
如果您尋找包括一堆類而不必一次你可以用它來定義每個等級:
$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();
至於它如何處理所有文件?我不確定可能會有這樣的速度下降。
如果你想包括所有的目錄及其子目錄:
$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;
}
不要忘了,它會用字母順序排列,包括您的文件。
如何做到這一點在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
如果有沒有相關文件之間 ...這裏是一個遞歸函數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');
我以爲會有一個使用include()更清晰的方式。 但這會做得很好。感謝大家。 – occhiso 2009-03-01 11:46:52
我會用一個配置文件構建一個合適的模塊系統,但那只是因爲我發現比只包含* everything *更靈活。 :-) – staticsan 2009-03-02 00:01:19
注意,只適用於在當前目錄中包含文件。可以遍歷get_include_path(),但這很快就會變得乏味。 – nalply 2011-11-18 11:13:23