Come la maggior parte degli sviluppatori Web in questi giorni, sto godendo appieno dei vantaggi dell'architettura MVC solida per applicazioni e siti Web. Quando si fa MVC con PHP, l'autoloading ovviamente è estremamente utile.Efficienti strategie di caricamento automatico e denominazione PHP
Sono diventato un fan di spl_autoload_register
semplicemente definendo una singola funzione __autoload()
, in quanto questo è ovviamente più flessibile se si stanno incorporando diversi moduli di base che utilizzano ciascuno il proprio autoloading. Tuttavia, non mi sono mai sentito bene riguardo alle funzioni di caricamento che scrivo. Considono un sacco di controllo delle stringhe e scansione delle directory per cercare le possibili classi da caricare.
Per esempio, diciamo che ho un app che ha un percorso di base definita come PATH_APP
, e una struttura semplice con le directory di nome models
, views
e controllers
. Utilizzo spesso una struttura di denominazione in cui i file sono denominati IndexView.php
e IndexController.php
all'interno della directory appropriata e, in genere, i modelli non hanno uno schema particolare per impostazione predefinita. Potrei avere una funzione loader per questa struttura come questa che viene iscritto su spl_autoload_register
:
public function MVCLoader($class)
{
if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
require_once(PATH_APP.'/models/'.$class.'.php');
return true;
}
else if (strpos($class,'View') !== false) {
if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
require_once(PATH_APP.'/views/'.$class.'.php');
return true;
}
}
else if (strpos($class,'Controller') !== false) {
if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
require_once(PATH_APP.'/controllers/'.$class.'.php');
return true;
}
}
return false;
}
Se non è trovato dopo che, potrei avere un'altra funzione per la scansione di sub-directory nella directory modelli. Tuttavia, tutto il se/else-ing, il controllo delle stringhe e la scansione delle directory mi sembra inefficiente, e mi piacerebbe migliorarlo.
Sono molto curioso di sapere quali strategie di denominazione dei file e di autoloading potrebbero utilizzare altri sviluppatori. Sto cercando in particolare le buone tecniche da impiegare per l'autoloading efficiente e non le alternative all'autoloading.
pimp +1 per la freschezza – Louis
Mi piace decisamente l'approccio di sottolineatura. Rende la traduzione da classe a file molto più efficiente. – zombat
Avvolgi 'array_unique()' attorno alla tua matrice '$ files'. Se non c'è un trattino basso nel nome della classe, stai provando ogni file due volte. – mpen