2010-07-26 11 views
8

Ho uno script che utilizza autoload per caricare classi non trovate. Non includo volutamente il file (anche se posso farlo) ma vorrei che la funzione di caricamento automatico includesse i file richiesti.PHP __autoload performance

Poiché lo script può essere ricorsivo, ovvero se la classe è già stata caricata, non voglio controllare che il file corrispondente sia caricato e se class_exists su ogni ricorsione dello script.

risposta

9

Se si desidera evitare __autoload, è possibile utilizzare require_once anziché include.

Il calo di prestazioni dell'utilizzo di __autoload può essere notevole, soprattutto perché alcune cache opcode non supportano correttamente. Tuttavia, dato che è molto utile, direi di usarlo a meno che la cache dell'opcode non memorizzi nella cache i caricamenti automatici.

+1

Non dimenticare che c'è anche 'include_once()'. – alex

+4

@alex Preferisco guidare la gente da "include" a meno che non sia assolutamente necessario (e molto raramente lo è). Essendo un costrutto che fallisce più o meno silenziosamente quando il file non esiste, mi ha rubato alcune ore di vita. – Artefacto

+0

@Artefacto D'accordo, ho pensato di parlarne. Inoltre, la cache opcode è utile in questo modo +1 – alex

6

Se avete il caricatore automatico impostato per caricare le vostre classi e non si utilizza require (et al.) Il caricatore automatico sarà chiamato solo se una classe viene fatto riferimento, che non esiste. Quindi non c'è mai bisogno di controllare class_exists nel caricatore automatico (non verrà chiamato se la classe esiste).

Per quanto riguarda le prestazioni. Se si utilizzano librerie di grandi dimensioni, il caricamento automatico può effettivamente essere più veloce in quanto carica solo i file o le classi richieste. In entrambi i casi la velocità è abbastanza trascurabile nella mia esperienza (usa sempre una cache opcode, come altri hanno menzionato).

+0

Non stavo parlando dell'uso di class_exist all'interno del caricamento automatico. Intendevo se non usavo la funzione autoload, dovevo usare class_exist prima di provare ad accedere alla classe, voglio dire che dovrei fare manualmente il caricamento automatico che è se la classe non lo fa Esistono alcuni file e poi riproviamo e siccome lo script sarà ricorsivo lo farei controllando la stessa cosa anche per le classi che sono già state caricate. – CoCoMo