PHP spl_autoload_register

Sto cercando di sfruttare l'autoloading in PHP. Ho varie classi in diverse directory, e quindi ho riavviato l'autoloading come segue:

function autoload_services($class_name) { $file = 'services/' . $class_name. '.php'; if (file_exists($file)) { require_once($file); } } function autoload_vos($class_name) { $file = 'vos/' . $class_name. '.php'; if (file_exists($file)) { require_once($file); } } function autoload_printers($class_name) { $file = 'printers' . $class_name. '.php'; if (file_exists($file)) { require_once($file); } } spl_autoload_register('autoload_services'); spl_autoload_register('autoload_vos'); spl_autoload_register('autoload_printers'); 

Tutto sembra funzionare bene, ma volevo solo ricontrollare che questa è effettivamente considerata una pratica accettabile.

Certo, sembra buono. L'unica cosa che potresti fare è registrarli nell'ordine in cui sono più propensi a colpire. Ad esempio, se le classi più utilizzate sono nei servizi, quindi vos, quindi le printingnti, l'ordine che hai è perfetto. Questo perché sono messi in coda e chiamati in ordine, quindi otterrai performance leggermente migliori in questo modo.

Potresti usare:

 set_include_path(implode(PATH_SEPARATOR, arrays(get_include_path(), './services', './vos', './printers'))); spl_autoload_register(); 

Usando spl_autoload_register senza argomenti si registrerà spl_autoload che cercherà il nome della class nelle directory del include path . Si noti che questo farà in minuscolo il nome della class prima di cercarlo sul filesystem.

Va bene, ma se queste sono solo cartelle sotto una certa cartella, ad es

 /library /JonoB /services /vos /printers 

potresti voler considerare l'aggiunta di questi ai tuoi nomi di class, ad es

 JonoB_Services_Foo, JonoB_Vos_Bar, JonoB_Printers_Baz 

e quindi dividere il nome della $classname per il carattere di sottolineatura e prendere each parte come nome della cartella. Questo è simile alla convenzione del nome della class PEAR . In questo modo avresti solo un caricatore.

Invece dei nomi di classi di convenzioni di stile PEAR, è ansible utilizzare anche namespace ( esempio di caricamento automatico ), ma tenere presente che questi richiedono PHP5.3 che non è ancora disponibile su hosting condiviso. E la tua applicazione non sarà retrocompatibile con PHP <5.3 (se questo è un problema).

Buon consiglio da tutte le altre risposte.

Permettethemes di aggiungere che ciascun autoloader dovrebbe innanzitutto verificare se interessa anche alla class in cui è stata inoltrata, e restituire immediatamente se non lo è.

Quindi, se si fa come suggerisce Gordon e si aggiunge un prefisso a ciascuna class, per Services_Foo il caricatore automatico autoload_services() dovrebbe vedere se "Services_" è la prima sottostring di $class_name , e se non restituisce false immediatamente per salvare in qualsiasi ulteriore elaborazione, in particolare i controlli del filesystem.

Se wheressi refactor your code , sarebbe

 function custom_autoload($class_name){ $dirs = arrays('services','vos','printers') foreach($dirs as $dir){ $file = $dir.'/'.$class_name. '.php'; if (file_exists($file)){ require $file; break; // if i have maintained naming conventions as per dir as there // is no point for looking eg: sample1_printer.php in the vos/ // or printer/. this way iam avoiding unnecessary loop } } } spl_autoload_register('custom_autoload');