Autoloader único en PHP usando spl_autoload_register

En este artículo vamos a ver como automatizar la carga de las clases o interfaces de nuestra aplicación de manera automática, evitando tener que controlar en cada fichero de la misma los engorrosos includes. Para ello vamos a hacer uso de la función spl_autoload_register. Está función añade la función que indiquemos a la pila de autocarga.



function wgobd_autoload( $class_name )
{
    // Código a ejecutar
}

spl_autoload_register( 'wgobd_autoload' );
De esta manera, en la linea 6 hemos registrado la función wgobd_autoload en la pila de autocarga, creando la misma en caso de no existir todavía, con eso conseguimos que cuando se quiera cargar una clase o interfaz que no haya sido 'definida', el interprete intentará encontrar dicha clase a través de los métodos definidos en la pila de autocarga. Vamos a completar el ejemplo en el que registramos la función de autocarga en un plugin de worpress, de manera que no sea necesario preocuparse por definir las clases que se utilizan a lo largo del mismo ya que esta función se encargaría de la carga automática de las mismas.
//Definimos la ruta base del plugin
define( 'WGOBD_PATH',             dirname( __FILE__ ) );

//Definimos las rutas que vamos a utilizar en el plugin, en este caso seguimos un patrón MVC

define( 'WGOBD_APP_PATH',         WGOBD_PATH . '/app' );
define( 'WGOBD_CONTROLLER_PATH',  WGOBD_APP_PATH . '/controller' );
define( 'WGOBD_MODEL_PATH',       WGOBD_APP_PATH . '/model' );
define( 'WGOBD_VIEW_PATH',        WGOBD_APP_PATH . '/view' );
define( 'WGOBD_HELPER_PATH',      WGOBD_APP_PATH . '/helper' );
define( 'WGOBD_EXCEPTION_PATH',   WGOBD_APP_PATH . '/exception' );

function wgobd_autoload( $class_name )
{
 // Convert class name to filename format.
 $class_name = strtolower( $class_name );
 $paths = array(
   WGOBD_CONTROLLER_PATH,
   WGOBD_MODEL_PATH,
   WGOBD_HELPER_PATH,
   WGOBD_EXCEPTION_PATH,
   WGOBD_LIB_PATH,
   WGOBD_VIEW_PATH,
 );

 // Buscamos en cada ruta los archivos
 foreach( $paths as $path ) {
  if( file_exists( "$path/$className.php" ) )
   require_once( "$path/$className.php" );
 }

}
spl_autoload_register( 'wgobd_autoload' );
En este caso se buscara en la ruta indicada, archivos cuyos nombres coincidan con el nombre de la clase buscada. Para evitar confusiones o problemas con otros plugins, podría utilizarse una nomenclatura más compleja a la hora de nombrar los archivos.

3 comentarios:

  1. Mil gracias, tu ejemplo de sirvio de mucho para entender su funcionalidad!

    ResponderEliminar
  2. Acabo de empezar con php y me ha venido de gran ayuda, muchas gracias.

    Lo único comentar que me ha dado fallo la línea 16 del ejemplo, creo que simplemente hay que cambiar el orden de las variables, de como están "$class_name = strtolower( $className );" a "$className = strtolower( $class_name );"

    ResponderEliminar
  3. Gracias por la observación, ya está cambiado.... es lo que tiene la costumbre de utilizar siempre camel case.

    ResponderEliminar