Odpowiedzi:
foreach (glob("classes/*.php") as $filename)
{
include $filename;
}
get_include_path()
nadal nie może automatycznie określić kolejność załadunku (klasa bazowa może być załadowany po dłuższym klasy, w wyniku błędów)
Oto sposób, w jaki dołączam wiele klas z kilku folderów w PHP 5. To zadziała tylko, jeśli masz klasy.
/*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;
}
}
}
Zdaję sobie sprawę, że jest to starszy post ALE ... NIE ZAWIERAJ SWOICH ZAJĘĆ ... zamiast tego użyj __autoload
function __autoload($class_name) {
require_once('classes/'.$class_name.'.class.php');
}
$user = new User();
Wtedy za każdym razem, gdy wywołasz nową klasę, która nie została jeszcze uwzględniona, php automatycznie uruchomi __autoload i załączy ją dla ciebie
Jeśli używasz php 5, możesz zamiast tego skorzystać z automatycznego ładowania .
to tylko modyfikacja kodu Karstena
function include_all_php($folder){
foreach (glob("{$folder}/*.php") as $filename)
{
include $filename;
}
}
include_all_php("my_classes");
Jak to zrobić w 2017 roku:
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
} );
Zalecane w dokumentacji PHP tutaj: Klasy autoloadingu
autoload
wejdzie do gry tylko wtedy, gdy ktoś spróbuje np. Stworzyć obiekt klasy, który nie został jeszcze załadowany.
Możesz użyć set_include_path :
set_include_path('classes/');
classes/
przy użyciu include
/require
Jeśli chcesz uwzględnić wszystko w katalogu ORAZ jego podkatalogach:
$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;
}
Nie zapominaj, że użyje kolejności alfabetycznej, aby dołączyć twoje pliki.
The entries are returned in the order in which they are stored by the filesystem.
- php.net/manual/en/function.readdir.php
Jeśli chcesz dołączyć kilka klas bez konieczności definiowania każdej klasy na raz, możesz użyć:
$directories = array(
'system/',
'system/db/',
'system/common/'
);
foreach ($directories as $directory) {
foreach(glob($directory . "*.php") as $class) {
include_once $class;
}
}
W ten sposób możesz po prostu zdefiniować klasę w pliku php zawierającym klasę, a nie całą listę $thisclass = new thisclass();
Co do tego, jak dobrze obsługuje wszystkie pliki? Nie jestem pewien, czy może to spowodować nieznaczne zmniejszenie prędkości.
Jeśli nie ma żadnych zależności między plikami ... oto funkcja rekurencyjna, aby dołączyć WSZYSTKIE pliki php we WSZYSTKICH podkatalogach:
$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');
<?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");
}
Sugeruję użycie funkcji readdir (), a następnie zapętlenie i dołączenie plików (patrz 1. przykład na tej stronie).
Nie pisz funkcji () w celu dołączenia plików do katalogu. Możesz utracić zakresy zmiennych i być może będziesz musiał użyć „globalnego”. Wystarczy zapętlić pliki.
Możesz również napotkać trudności, gdy dołączony plik ma nazwę klasy, która będzie rozciągać się na inną klasę zdefiniowaną w innym pliku - która nie jest jeszcze uwzględniona. Więc uważaj.