2011-09-15 12 views
8

Ciao Sto sviluppando una libreria per accordi di chitarra. In alcuni file sulla libreria che ho qualcosa di simile:Creazione di una libreria PHP, come renderla indipendente?

require_once "lib/GuitarChord.php"; 
require_once "lib/Chord.php"; 
require_once "lib/Key.php"; 
require_once "lib/Tuning.php"; 

Come posso fare questa libreria in modo che non ha bisogno di sapere dove gli altri file di libreria sono?

In questo modo una persona potrebbe avere i file della libreria in qualsiasi directory?

Modifica: seconda domanda rimossa.

+2

È meglio porre una domanda alla volta e cercare di mantenerle il più specifiche possibile. – Jon

+0

C'è qualche possibilità di vedere questa libreria? È su GitHub? – Gordon

risposta

7

Creare caricatori automatici per tutti i luoghi in cui potrebbero essere queste classi.

Per esempio:

//AUTOLOADER 
function class_autoloader($class) { 

    // presumes classes are in './classes' 
    $folders = array(
    './', './../', './../../' 
    ); 
    $directories = array(
    'classes','lib', '' 
    ); 
    $dir = dirname(__FILE__); 
    $theClass = '/' . $folderedClass . '.php'; 


    foreach($folders as $folder){ 
     foreach($directories as $directory){ 
      $theInclude = $dir.$folder.$directory.$theClass; 

      if (file_exists($theInclude) && include_once($theInclude)) { 
       return TRUE; 
      } 
     } 
    } 

    trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING); 

    return FALSE; 
} 

spl_autoload_register('class_autoloader'); 

Poi, se si desidera caricare il Chord Classe e sai che si trova nella cartella lib, il caricatore automatico farà il lavoro per voi quando fate:

new Chord(); 

È possibile allegare molte callback autoloader differenti con spl_autoload_register

+0

Esiste un modo per far sapere alla libreria dove si trovano automaticamente gli altri file? Gli altri file si troveranno sempre nella stessa directory del punto di ingresso della libreria. Per es. richiede "lib/glib.php"; glib è il punto di ingresso. Si presuppone che tutti gli altri file siano su lib /. È possibile? – carlosdubusm

+0

@carlos - questo è 'automaticamente' il suo chiamato' autoload' – Neal

1

Se la libreria utilizza tutte o la maggior parte delle classi incluse, prendere in considerazione l'inserimento di tutte le classi correlate alla libreria nello stesso file. Altre soluzioni implicheranno l'aggiunta di più codice, nel qual caso dovresti probabilmente limitarti a usare il tuo metodo attuale.

Se si desidera che i file divisi per scopi di sviluppo poi con tutti i mezzi continuano a farlo, ma è ancora possibile comprimerlo in un unico file per l'uso in produzione per le persone di includere facilmente.

+0

1st off - Non ho fatto downvoting, secondo - il mio problema è che potresti caricare classi di cui ** non hai bisogno ** se crei un file di classe ** BIG **, potrebbe essere meglio con file più piccoli e un autoloader – Neal

1

Da qualche parte dovresti includere il nome della cartella, se non vuoi includere tutte le tue classi in un unico file. Si può fare da qualche parte che l'utente deve solo impostare una volta, però:

$lib_folder = "lib"; 

require_once $lib_folder . "/GuitarChord.php"; 
require_once $lib_folder . "/Chord.php"; 
require_once $lib_folder . "/Key.php"; 
require_once $lib_folder . "/Tuning.php"; 

Per quanto riguarda la gestione di diversi tipi di database, è possibile effettuare un'altra impostazione come $ tipo_db che l'utente sia imposta a "MySQL", " FILE "," XML ", ecc. E dove si effettuano chiamate al db, utilizzare un'istruzione switch per vedere quale metodo di database stanno utilizzando e modificare di conseguenza la chiamata.

Edit: Vale anche la pena guardare in PHP's __autoload feature

0

si dovrebbe verificare namespaces e autoloaders.

Diciamo che avere tutte le classi all'interno dello spazio dei nomi 'GuitarChords' - così si può solo creare funzione autoload qualcosa di simile a seguire (file, dove si registra il caricatore automatico assumendo è nella directory principale di "lib"):

spl_autoload_register(function($class){ 
     $namespace = explode('\\', $class, 2); 
      if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) { 
      include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php'); 
      } 
    }); 

Penso che sia meglio registrare una funzione di caricamento automatico specifico per ogni set di librerie/spazio dei nomi. L'iterazione delle directory e l'utilizzo di include_once, file_exist ecc. Potrebbero causare un sovraccarico di I/O a seconda della complessità del sistema.

Problemi correlati