2011-12-13 18 views
15

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:

  1. 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?
  2. Mi mancano alcuni evidenti vantaggi qui al di fuori delle ovvie caratteristiche OOP?
  3. 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; 
    } 
} 
+0

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

risposta

4

si confrontano le funzioni con i metodi. Questo è solo zucchero sintattico.

A meno che non si disponga di un autoloader basato su mappa o di uno che ha una tabella delle dipendenze incorporata, non è necessario alcun attributo di livello di classe per tenere traccia delle cose (o potrebbe fare altrimenti ricorso a variabili statiche o globali). La riconfigurabilità in runtime non è una necessità reale nella pratica.

possibile rendere il progetto configurabile con costanti ecc un autoloader procedurale Avere proprietà del costruttore non è così significativo di un beneficio per il riutilizzo con un'implementazione del metodo. Può solo sembrare un po 'più bello.

0

Utilizzare quello precostruito se si utilizza già un'altra parte importante del framework, altrimenti non importa.

Inoltre, utilizzando uno caricatore automatico, con più spazi dei nomi/directory registrati ridurrà la memoria anche di poco, ma che non è davvero un problema.

+0

Grazie per la risposta. Non uso questi framework. Generalmente preferisco selezionare le mie caratteristiche preferite da vari framework e non sto cercando di avere una discussione "Dovresti usare un framework" :) Inoltre, attualmente sto utilizzando solo un caricatore automatico. Informazioni sull'aggiornamento della domanda con codice di esempio . – rdlowrey