Risposte:
foreach (glob("classes/*.php") as $filename)
{
include $filename;
}
get_include_path()
non riesce ancora a determinare automaticamente l'ordine di caricamento (la classe base può essere caricata DOPO la classe estesa, con conseguenti errori)
Ecco il modo in cui includo molte classi da diverse cartelle in PHP 5. Questo funzionerà solo se hai delle classi.
/*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;
}
}
}
Mi rendo conto che questo è un post più vecchio MA ... NON INCLUDERE LE TUE CLASSI ... invece usa __autoload
function __autoload($class_name) {
require_once('classes/'.$class_name.'.class.php');
}
$user = new User();
Quindi ogni volta che chiami una nuova classe che non è stata ancora inclusa, php genererà automaticamente __autoload e lo includerà per te
Se stai usando php 5 potresti invece voler usare il caricamento automatico .
questa è solo una modifica del codice di Karsten
function include_all_php($folder){
foreach (glob("{$folder}/*.php") as $filename)
{
include $filename;
}
}
include_all_php("my_classes");
Come fare questo nel 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
} );
Consigliato dalla documentazione PHP qui: Classi di caricamento automatico
autoload
entrerà in gioco solo quando qualcuno prova ad esempio a creare un oggetto della classe che non è stato ancora caricato.
Puoi usare set_include_path :
set_include_path('classes/');
classes/
quando si utilizza include
/require
Se vuoi includere tutto in una directory E nelle sue sottodirectory:
$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;
}
Non dimenticare che utilizzerà l'ordine alfabetico per includere i tuoi file.
The entries are returned in the order in which they are stored by the filesystem.
- php.net/manual/en/function.readdir.php
Se stai cercando di includere un gruppo di classi senza dover definire ciascuna classe contemporaneamente puoi utilizzare:
$directories = array(
'system/',
'system/db/',
'system/common/'
);
foreach ($directories as $directory) {
foreach(glob($directory . "*.php") as $class) {
include_once $class;
}
}
In questo modo puoi semplicemente definire la classe sul file php contenente la classe e non un intero elenco di $thisclass = new thisclass();
Quanto bene gestisce tutti i file? Non sono sicuro che potrebbe esserci una leggera riduzione della velocità con questo.
Se non ci sono dipendenze tra i file ... ecco una funzione ricorsiva per includere_una volta TUTTI i file php in TUTTI i sottodir:
$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");
}
Ti suggerisco di utilizzare una funzione readdir () e quindi eseguire il ciclo e includere i file (vedere il primo esempio in quella pagina).
Non scrivere una funzione () per includere i file in una directory. È possibile perdere gli ambiti variabili e potrebbe essere necessario utilizzare "globale". Basta passare in rassegna i file.
Inoltre, potresti riscontrare difficoltà quando un file incluso ha un nome di classe che si estenderà all'altra classe definita nell'altro file, che non è ancora inclusa. Perciò stai attento.