Fino a questo punto ho usato le funzioni del caricatore automatico standalone procedurale e registrato con spl_autoload_register() per caricare automaticamente le mie classi (di solito) namespace. Ultimamente, però, ho notato persone che citano l'uso di classi di caricatori automatici in combinazione con alcuni dei principali framework PHP.PHP autoloader class vs procedural autoloader function?
Quasi tutto il mio codice è orientato agli oggetti in questi giorni, ma io non vedo vantaggi di utilizzare una classe "caricatore automatico" nel corso di un funzione di base in questo caso. E in termini di testabilità, mi sento abbastanza bene nell'usare i controlli class_exists() nei miei test per verificare che le funzioni procedurali caricino i file correttamente.
Quindi le mie domande sono tre:
- Quali vantaggi o caratteristiche (se presenti) mi potrebbero influenzarne il refactoring cose e iniziare a utilizzare un oggetto in piena regola per caricare automaticamente i file di classe?
- Mi mancano alcuni evidenti vantaggi qui al di fuori delle ovvie caratteristiche OOP?
- la prego di fare un caso per entrambi i caricatori automatici procedurali o di classe?
UPDATE
Di seguito alcuni esempi di codice per una tipica funzione autoload potrei impiegare. È metacode, quindi non cercare errori di battitura. Organizzo le mie strutture di directory in modo che rispecchino gli spazi dei nomi. L'ipotetica funzione explode_namespaces()
potrebbe teoricamente essere inclusa come metodo statico insieme a un metodo statico autoload()
in una classe, quindi questo è un vantaggio. Potrebbe essere più pulito combinare queste disparate funzioni di "utilità" come metodi in una singola classe.
function autoload($class_name)
{
$root = APP_LIBS; // a directory path constant set at config time
if ($namespaces = explode_namespaces($class_name)) {
$domain = array_shift($namespaces);
$root .= "/$domain/";
$class_name = array_pop($namespaces);
$directories = array();
foreach ($namespaces as $directory) {
$directories[] = $directory;
}
$root .= implode($directories, '/');
}
$file = "$root/$class_name.php";
if (file_exists($file)) {
include $file;
}
}
Ho rimosso la parte "risposta" dalla tua domanda poiché è irrilevante per la domanda. Dovresti considerare di aggiungere la tua risposta, probabilmente aiuterà gli altri :) – James