2011-09-15 12 views
8

Hola, estoy desarrollando una biblioteca para acordes de guitarra. En algunos archivos en la biblioteca tengo algo como esto:Hacer una biblioteca php, cómo hacerla independiente?

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

¿Cómo puedo hacer que esta biblioteca por lo que no necesita saber donde los demás archivos de la biblioteca son?

De esta manera una persona podría tener los archivos de la biblioteca en cualquier directorio?

Editar: Se quitó la segunda pregunta.

+2

Es mejor hacer una pregunta a la vez y tratar de mantenerlas lo más específicas posible. – Jon

+0

¿Hay alguna posibilidad de ver esta biblioteca? ¿Está en GitHub? – Gordon

Respuesta

7

Crear cargadores automáticos para todos los lugares en los que estas clases sean.

Por ejemplo:

//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'); 

Entonces, si desea cargar la clase Chord y sabe que está en la carpeta lib, el cargador automático va a hacer el trabajo por usted cuando lo hace:

new Chord(); 

Puede conectar muchas devoluciones de llamada de autocargador diferentes con spl_autoload_register

+0

¿Hay alguna forma en que pueda hacer que la biblioteca sepa dónde están ubicados automáticamente los otros archivos? Los otros archivos siempre estarán en el mismo directorio que el punto de entrada de la biblioteca. Por ej. requiere "lib/glib.php"; glib es el punto de entrada. Se supone que todos los demás archivos están en lib /. es posible? – carlosdubusm

+0

@carlos - esto es 'automáticamente' se llama' autocargado' – Neal

1

Si su biblioteca utiliza todas o la mayoría de las clases incluidas, considere la posibilidad de colocar todas las clases relacionadas con su biblioteca en el mismo archivo. Otras soluciones solo implican agregar más código, en cuyo caso, probablemente debería seguir utilizando su método actual.

Si desea dividir los archivos para fines de desarrollo, continúe haciéndolo, pero aún puede empaquetarlo en un solo archivo para uso de producción para que las personas lo incluyan fácilmente.

+0

1er apagado - No he votado negativamente, segundo - mi problema con eso es que podrías cargar clases que ** no necesitas ** si haces un archivo de clase ** BIG **, podría ser mejor con archivos más pequeños y un autocargador – Neal

1

En algún lugar tendrá que incluir el nombre de la carpeta, si no desea incluir todas sus clases en un solo archivo. Se puede hacer en alguna parte que el usuario sólo tiene que configurar una vez, sin embargo:

$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"; 

cuanto a manejo de diferentes tipos de bases de datos, puede presentar otra configuración como $ tipo_bd que el usuario pone a "MySQL", " ARCHIVO "," XML ", etc. Y cuando realiza llamadas a la base de datos, utilice una declaración de cambio para ver qué método de base de datos están usando y cambie su llamada en consecuencia.

Editar: Es también digno de mirar en PHP's __autoload feature

0

Debe consultar namespaces y autoloaders.

Digamos que tiene todas sus clases dentro del espacio de nombres 'GuitarChords' - lo que sólo puede crear la función de autocarga algo similar a la siguiente (archivo, donde se registra su cargador automático asumiendo está en el directorio principal de "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'); 
      } 
    }); 

Creo que es mejor registrar una función de autocarga para cada conjunto de bibliotecas/espacio de nombres específicamente. Iterar directorios y usar include_once, file_exists, etc. podría producir una sobrecarga de IO desagradable en función de la complejidad de su sistema.

Cuestiones relacionadas