Blog de Gonzalo

AUTOLOAD

Hace poco estaba haciendo memoria de mis primeros proyectos en php y me acuerdo que había un fichero global donde se hacían todos los requires de los ficheros necesaroios en el proyecto como las librerías de funciones, los accesos a base de datos, etc...
Pero ahora se hace todo de forma más fácil y más eficiente que es usar la función autoload (desde la versión 5 de php) y la verdad es que es bastante beneficioso por varias razones:
-Te ahorra tener un fichero con varios includes. Imáginate que se te olvida incluir alguno o incluyes alguno dos o más veces y claro te saltarían los errores correspondientes como funciones redeclaradas o funciones que no existen, etc...
-Se tendrían varios ficheros ocupando memoria de forma innecesaria.
El funcionamiento de autoload es bastante sencillo:


//Fichero global.php
function __autoload($nombre_clase) {
include $nombre_clase . '.php';
}
//Clase test1.php
class test
{
function __construct() { print 'Test'; }
}
//Clase test1.php
class test1
{
function __construct() { print 'Test1'; }
}
//Fichero donde se instanciaran las clases pruebas.php
require_once('global.php');
$test = new test();

Como se puede ver en el ejemplo hay tres ficheros:
-global.php: Donde está declarada la función autoload y cuando se instancia cualquier objeto dicha función buscará la case y la incluirá y así se evita tener todas las clases de la aplicación cargadas en memoria. En este ejemplo, no se ha complicado mucho porque todos los ficheros están en la misma ruta. Pero en un proyecto real tendría que indicarse la ruta, etc...
-test.php y test1.php: Son dos clases que en este caso tienen un echo en el constructor pero en cualquier proyecto real tendr´ran la lógica de negocio.
-pruebas.php: Fichero que incluye el fichero global.php para que al instanciar los objetos necesarios para la aplicación.
Pero para proyectos más complejos se pueden hacer las cosas mejores. Con el ejemplo anterior os he comentado que habria que especificar la ruta de las clases. Imaginemos que tenemos un proyecto bastante grande donde las clases están organizada sen diferentes carpetas y antes de meter programación compleja en el autoload se pueden configurar varios autoload según el caso y así poder tener el código más ordenado.
Para poder hacer ésto hay que usar spl_autoload_register() que permite implementar los autoload necesarios según las necesidades del proyecto:

    spl_autoload_register('autoload_helper');
spl_autoload_register('autoload_bbdd');
function second_helper($classname) {
include $ruta_helper.$nombre_clase . '.php';
}
function second_bbdd($classname) {
include $ruta_bbdd.$nombre_clase . '.php';
}

El ejemplo anterior es bastante sencillo. Sólo quería enseñar su funcionamiento. Espero que haya valido la ayuda.

Compartir en twitter