Wie kann man alle PHP-Dateien aus einem Verzeichnis einbinden?

Sehr schnelle n00b Frage, in PHP kann ich ein Verzeichnis von Skripten enthalten.

dh statt:

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

Gibt es etwas wie:

 include('classes/*'); 

Es scheint keinen guten Weg zu geben, eine Sammlung von etwa 10 Unterklassen für eine bestimmte class einzubeziehen.

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

Hier ist die Art und Weise, wie ich viele classn aus mehreren Ordnern in PHP 5 einschließe. Dies funktioniert jedoch nur, wenn Sie classn haben.

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

Ich weiß, dass dies ein älterer Beitrag ist, ABER … BEINHALTEN SIE NICHT IHRE KLASSEN … Verwenden Sie stattdessen __autoload

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

Dann, wann immer du eine neue class anrufst, die noch nicht enthalten ist, wird php automatisch __autoload auslösen und sie für dich einbinden

Das ist nur eine Modifikation von Karstens Code

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

Wenn Sie PHP 5 verwenden, möchten Sie vielleicht stattdessen Autoload verwenden.

Wie man das 2017 macht:

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

Empfohlen von PHP-Dokumentation hier: Autoloading-classn

Sie können set_include_path verwenden :

 set_include_path('classes/'); 

http://php.net/manual/en/function.set-include-path.php

Wenn Sie alle in ein Verzeichnis und seine Unterverzeichnisse einschließen wollen:

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

Vergiss nicht, dass deine Dateien in alphabetischer Reihenfolge eingefügt werden.

Wenn KEINE Abhängigkeiten zwischen den Dateien bestehen … ist hier eine rekursive function um include_once ALLE php Dateien in ALLEN Unterdiven zu enthalten:

 $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 "\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'); 

Ich schlage vor, Sie verwenden eine readdir () -function und dann Schleife und fügen Sie die Dateien (siehe das erste Beispiel auf dieser Seite).

Wenn Sie eine Menge classn einbeziehen möchten, ohne jede class auf einmal definieren zu müssen, können Sie Folgendes verwenden:

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

Auf diese Weise können Sie einfach die class in der PHP-Datei definieren, die die class enthält und nicht eine ganze Liste von $thisclass = new thisclass();

Wie gut behandelt es alle Dateien? Ich bin mir nicht sicher, ob es eine leichte Geschwindigkeitsabnahme geben könnte.

Schreiben Sie keine function (), um Dateien in ein Verzeichnis aufzunehmen. Sie können die variablen Bereiche verlieren und müssen möglicherweise “global” verwenden. Schlingen Sie einfach die Dateien an.

Es kann auch zu Schwierigkeiten kommen, wenn eine enthaltene Datei einen classnnamen hat, der sich auf die andere class erstreckt, die in der anderen Datei definiert ist – die noch nicht enthalten ist. Also sei vorsichtig.