¡¡Compartenos!!

domingo, 2 de diciembre de 2012

Codigo - PHP - Autocarga de Classes no definidas

Cuantas veces programamos en algún lenguaje y no somos conscientes de las malas practicas que realizamos. No siempre han de ser consideradas malas practicas, simplemente puede ser desconocimiento o rutina, habituados a hacer las cosas de una manera concreta que funciona... ¿Por que cambiar?

Pues aquí esta la respuesta: "El cambio es necesario cuando es a mejor".

En este caso la curva de aprendizaje de cosas nuevas en un lenguaje de programación dado, depende mucho de la sintaxis y estructura del lenguaje en cuestión, pero centrándonos en PHP y en el caso que nos ocupa, podremos observar que la curva de aprendizaje es relativamente corta en el tiempo y alta en conocimientos adquiridos. Así que pongámonos manos a la obra.

Autocarga de Classes no definidas a través de include o require.

A través de la función:

spl_autoload_register($funcion);

Conseguiremos decirle a PHP cual es la forma de tratar de cargar nuevas clases que no tengamos incluidas explícitamente con include, require o sus derivados.

Aquí dejo una forma genérica de realizar esta gestión de classes:

/*
* defined function responsible for loading class,
* replacing the old __ autoload.
* ROOT is constant of the path root of the system
*/
spl_autoload_extensions('.class.php');
spl_autoload_register('loadClasses');

 function loadClasses($className)
 {
   
    if( file_exists(ROOT_DIR.DS.'controller/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'controller'.DS);
        spl_autoload($className);
    }
    elseif( file_exists('model/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'model'.DS);
        spl_autoload($className);
    }elseif( file_exists('view/'.$className.'.class.php' ) ){
        set_include_path(ROOT_DIR.DS.'view'.DS);
        spl_autoload($className    );
    }else
    {
        set_include_path(ROOT_DIR.DS.'lib'.DS);
        spl_autoload($className    );
    }
 }



Básicamente, este snipplet de código determina una función que busca y comprueba si existe un fichero determinado en una ruta usando unas condiciones para mirar en varios directorios.
Previamente define la extensión por defecto para las clases como ".class.php"

Gracias a este pequeño código cargado practicamente al principio de vuestra estructura, conseguiréis instanciar una clase sin necesidad de incluirla con la limpieza de código que eso supone y la versatilidad de no tener que incluir el código de la case en distintos sitios.

Disfrutad!

No hay comentarios:

Publicar un comentario