Funzioni di autoload semplici complesse o multiple

3

Utilizzando spl_autoload_register () , dovrei usare una singola funzione di caricamento automatico che contenga tutta la logica per determinare dove sono i file di inclusione o dovrei interrompere ogni raggruppamento di inclusione nella sua stessa funzione con la sua logica includere i file per la funzione chiamata? Poiché i luoghi in cui possono risiedere i file possono espandersi, anche la logica di una singola funzione. Se lo suddivido in più funzioni, posso aggiungere delle funzioni quando vengono aggiunti nuovi raggruppamenti, ma le funzioni saranno copia / incolla l'una dell'altra con piccole modifiche.

Attualmente ho uno strumento con una singola funzione di caricamento automatico che distingue il nome della classe e cerca di prevedere dove si trova e quindi includerlo. A causa delle convenzioni di denominazione per il progetto, questo è stato piuttosto semplice.

if has namespace 
  if in template namespace look in Root\Templates
  else look in Root\Modules\Namespace
else
  look in Root\System
if file exists include

Ma stiamo iniziando a includere Interfacce e Tracce nella nostra base di codice e mi fa male includere il tipo di una cosa nel suo nome. Quindi guardiamo invece di una singola funzione di caricamento automatico che scava il nome della classe e cerca il file e ha una logica sempre più complessa, stiamo cercando di registrare più funzioni di caricamento automatico. Ma ognuno segue lo stesso schema e ogni volta che vedo che divento paranoico sulla copia del codice.

function systemAutoloadFunc
  logic to create probable filename
  if filename exists in system include it and return true
  else return false

function moduleAutoloadFunc
  logic to create probable filename
  if filename exists in modules include it and return true
  else return false

Ogni funzione di caricamento automatico seguirà quel modello e l'ultimo di ogni funzione se il nome del file esiste, include return true else return false sarà un codice identico. Questo mi rende paranoico sul fatto di doverlo aggiornare più tardi su tutta la linea se il file_exists include il modello che stiamo usando sempre. O è solo che, la paranoia e le molteplici funzioni con un codice identico è l'opzione migliore?

    
posta Tyson of the Northwest 16.08.2014 - 00:20
fonte

1 risposta

2

La registrazione di più caricatori automatici consente di separare diverse convenzioni di denominazione per i nomi di directory e file e sarà più semplice da mantenere a lungo termine.

Immagina di dover aggiungere o rimuovere funzionalità per il caricatore automatico. Dovresti tuffarti in una funzione monolitica o semplicemente modificare o aggiungere una funzione più piccola?

Chiamate simili a "file_exists () / include () / return" può essere inserito in una funzione di supporto anziché copypasting di quel codice.

function autoload_attempt($path){
    if (file_exists($path)) {
        include $path;
        return true;
    } else return false;
}

spl_autoload_register(function($class){
    $path = ... naming logic ...
    return autoload_attempt($path);
});

La registrazione di quelli diversi ti dà anche un controllo più semplice sull'ordine in cui vengono invocati. Ad esempio, se vuoi avere una directory di override del master, devi prima registrarla.

Dal manuale: link

If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined. By contrast, __autoload() may only be defined once.

    
risposta data 25.08.2015 - 06:29
fonte

Leggi altre domande sui tag