Caricamento dinamico di file e classi La classe Zend_Loader include metodi per aiutare il caricamento dinamico di file. Zend_Loader contro require_once() I metodi di Zend_Loader sono la scelta migliore se il nome del file da caricare è variabile. Per esempio, se è basato su un parametro immesso da un utente o l'argomento di un metodo. Se si sta caricando un file o una classe dove il nome è costante, non c'è alcun beneficio nell'utilizzo di Zend_Loader rispetto all'uso delle funzioni PHP tradizionali come require_once(). Caricamento di file Il metodo statico Zend_Loader::loadFile() carica un file PHP. Il file caricato può contenere qualsiasi codice PHP. Questo metodo è un wrapper per la funzione PHP include(). Genera un'eccezione Zend_Exception in caso di errore ad esempio se il file specificato non esiste. Esempio del metodo loadFile() Il parametro $filename specifica il nome del file da caricare, che non deve contenere alcuna indicazione di un percorso. Un controllo di sicurezza è eseguito su $filename. $filename può contenere unicamente caratteri alfanumerici, trattini ("-"), underscore ("_") o punti ("."). Nessuna di queste restrizioni è applicata al parametro $dirs. Il parametro $dirs specifica le cartelle nelle quali cercare il file. Se NULL, la ricerca è eseguita solo nei percorsi contenuti in include_path. Se una stringa o un array, la ricerca è eseguita nella cartella o nelle cartelle specificate, quindi in include_path. Il parametro $once è un booleano. Se TRUE, Zend_Loader::loadFile() utilizza la funzione PHP include_once() per caricare il file, altrimenti è utilizzata la funzione PHP include(). Caricamento di classi Il metodo statico Zend_Loader::loadClass($class, $dirs) carica un file PHP ed esegue un controllo sull'esistenza della classe. Esempio del metodo loadClass() La stringa che specifica la classe è convertita in un percorso relativo sostituendo i separatori di cartella ai caratteri di underscore ("_") ed appendendo l'estensione '.php'. Nell'esempio precedente 'Container_Tree' diventa 'Container\\Tree.php'. Se $dirs è una stringa o un array, Zend_Loader::loadClass() esegue la ricerca nelle cartelle nell'ordine indicato. Il primo file trovato viene caricato. Se il file non esiste in $dirs allora la ricerca è eseguita in include_path. Se il file non è trovato o la classe non esiste dopo il caricamento, Zend_Loader::loadClass() genera un'eccezione Zend_Exception. Il metodo Zend_Loader::loadFile() è utilizzato per il caricamento del file, dunque il nome della classe può contenere solo caratteri alfanumerici, trattini ("-"), underscore ("_") o punti ("."). Verifica del permesso di lettura di un file Il metodo statico Zend_Loader::isReadable($pathname) restituisce TRUE se il file al percorso specificato esiste ed è leggibile, altrimenti FALSE. Esempio del metodo isReadable() Il parametro $filename specifica il nome del file da verificare. Può contenere l'indicazione di un percorso. Questo metodo è un wrapper per la funzione PHP is_readable(). La funzione PHP non esegue la ricerca nelle cartelle indicate da include_path, contrariamente a Zend_Loader::isReadable(). Utilizzo dell'autoloader La classe Zend_Loader contiene un metodo che è possibile registrare nella libreria PHP SPL autoloader. Zend_Loader::autoload() è il metodo di callback. Per comodità, Zend_Loader fornisce la funzione registerAutoload() per registrare automaticamente il proprio metodo autoload(). Se l'estensione spl_autoload non è presente nell'ambiente PHP, il metodo registerAutoload() genera un'eccezione Zend_Exception. Esempio di registrazione del metodo di callback autoloader Dopo aver registrato il metodo di callback autoload del Framework Zend, è possibile referenziare le classi del framework senza la necessità di caricarle esplicitamente. Il metodo autoload() utilizza Zend_Loader::loadClass() in automatico ogni volta che una classe è referenziata. Se si estende la classe Zend_Loader è possibile passare un parametro opzionale al metodo registerAutoload() per specificare la classe dalla quale registrare il metodo autoload(). Esempio di registrazione del metodo di callback autoloader di una classe estesa A causa della semantica del referenziamento delle classi statiche in PHP, è necessario implementare il codice per entrambi i metodi loadClass() ed autoload(), ed il metodo autoload() deve chiamare self::loadClass(). Se il proprio metodo autoload() delega al metodo genitore la chiamata a self::loadClass(), allora chiama il metodo con lo stesso nome nella classe genitore, non nella sottoclasse. E' possibile rimuovere un autoload callback. Il metodo registerAutoload() ha un secondo parametro opzionale, che corrisponde a TRUE per impostazione predefinita. Se il parametro ha valore FALSE allora il callback è rimosso dalla pila degli autoload SPL al posto di essere registrato.