Domanda

Nel mio include_path sul lato server ho un riferimento a una directory di pera, in '/ usr / share / pera /'. Entro le mie applicazioni includo file da una libreria comune, che vivono in '/ usr / share / pera / library /' con require_once 'library/file.php'.

Recentemente ho iniziato ad usare il caricatore automatico spl, ho notato nella funzione loader è necessario determinare la logica con cui includere il file. Il mio primo modo per farlo è cercare di includere un file e reprimere con @ per vedere se fallirebbe, per esempio @include 'library/file.php' Tuttavia penso soprattutto perché ho letto molto su @ essere una cattiva pratica ho deciso di fare manualmente il lavoro me stesso facendo esplodere get_include_path dal PATH_SEPARATOR e vedere se la directory è quello che voglio che sia, poi facendo un file_exists e includendolo .

In questo modo:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

sono andato la strada sbagliata? Dovrei ho appena fatto il business @include o sto facendo un po 'nella direzione giusta?

È stato utile?

Soluzione

Una cosa che il Habari progetto caricatore automatico fa che è interessante è la cache l'elenco dei file di classe tutto in memoria in modo che non sta facendo ricerche su disco per i file ogni volta che viene richiesta una classe.

In sostanza, si dichiara una statica all'interno del vostro __autoload() che contiene una matrice di tutti i file di classe, indicizzato dalla classe che li farà caricare. Ad esempio, il codice utilizza Dir o glob() per generare questo array statico:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

Poi si includere semplicemente $class_files[$class] per ottenere il file corretto. Questo è bello e veloce perché ottiene il catalogo dal disco tutto in una volta, piuttosto che generare la lista o la ricerca di un nome di file specifico ogni volta che una nuova classe viene fatto riferimento. (Sareste sorpresi quanto di una differenza di velocità che fa.)

Se il nome della classe non è una chiave nella matrice, è possibile lanciare un'eccezione personalizzata o generare uno stub / classe finta di tornare. Inoltre, se si estrae il caricatore automatico sistema di Habari, vedrai che Habari implementa __static() in classi che vengono caricata automaticamente, che è come un costruttore per classi statiche.

include_once() è da evitare, e l'operatore @ non è necessaria se hai controllato per il file da includere.

Altri suggerimenti

Io personalmente vado il modo con

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

anche senza la @ per facilitare il debugging (errori vengono arrestati / inserito produzione)

Si potrebbe anche essere interessato al relativo discussione sulla lista sviluppatore PHP: http: / /marc.info/?t=125787162200003&r=1&w=2

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top