Autocarga de scripts externos

Cuando hablamos de programación orientada a objetos comentamos, en este artículo, que hacer un include() de cada clase que necesite nuestro script no es la mejor manera de incorporar clases a nuestro código. Esto se debe a una razón muy clara: la ruta de una clase puede cambiar en la organización jerárquica de nuestro diseño. Con el tiempo, los desarrollos evolucionan, y la organización jerárquica puede ampliarse o variar sustancialmente. Si tenemos una clase incorporada con include() o require() a nuestros scripts, es muy fácil que tengamos que cambiar las rutas de inclusión en tantos sitios que, en la práctica, eso resulte una pérdida de tiempo y una fuente de errores.

La solución es crear un proceso de autocarga (cosa que PHP nos permite hacer muy cómoda y fácilmente), de forma que todas las clases se carguen correctamente, en donde sea necesario su uso, estén dónde estén. Y, como en un proyecto bien concebido, todos los procesos son realmente clases, si necesitamos reestructurar la jerarquía de directorios no vamos a tener ningún problema en hacerlo, con un trabajo mínimo, y sin posibilidad de que se produzcan errores por esta causa. Vamos a ello.

CREANDO UNA ESTRUCTURA

Vamos a empezar partiendo de una estructura que nos sirva para ver como funciona la autocarga de clases (y de otros scripts, si a eso vamos) partiendo de un ejemplo que tenemos en uno de los artículos de programación orientada a objetos. En concreto, es el de este artículo, que usa un script principal, tres clases y una interface. Así tenemos de todo un poco para ver cómo sacarle realmente partido a la autocarga. La estructura del proyecto la vemos completa en la imagen a la derecha. Observa que, además del script principal (index.php) y los directorios y clases, en el directorio raíz del proyecto hay un script llamado autocarga.php, que es el que vamos a usar para este artículo.

Como puedes ver, aparte del script autocarga.php el resto del proyecto tiene la misma estructura de directorios y archivos que en el artículo que te he citado hace un momento. Si lo cargas en el navegador (con http://localhost/autocarga) verás que te da unos resultados que se corresponden con el código de la aplicación, como veremos al entrar en detalles.

EL ARCHIVO DE AUTOCARGA

Tradicionalmente, para realizar la autocarga de archivos se empleaba, en PHP, la función __autoload(). Sin embargo, según leemos en la documentación oficial, desde la varsión 5.3 del lenguaje los fabricantes están considerando declararla obsoleta, por lo que es posible que, en un futuro próximo, deje de funcionar. Por esta razón, nosotros no vamos a emplearla. En su lugar vamos a usar, como nos recomienda la documentación, la función spl_autoload_register(). Esta función recibe, como argumento, un nombre de una función que debemos definir nosotros, y que es la que, realmente, se va a encargar de la autocarga. Esta manera de trabajar de PHP, basada en delegar en el programador la tarea de realizar las funciones necesarias a su criterio, es cada vez más habitual en PHP, y debemos acostumbrarnos a ella.

El script para la autocarga de las clases, llamado autoload.php, es el siguiente:

A pesar de los comentarios incluidos en el código, es muy posible que no entiendas cómo funciona esto. De hecho, ni siquiera funciona aún, porque tenemos que añadir, aún, algunas modificaciones al resto de archivos del proyecto.

LOS NAMESPACES

Todo lo relativo a la autocarga de ficheros en un proyecto está basado en los namespaces en PHP. Puedes leer lo básico sobre esta cuestión en estos artículos, pero es en este dónde aprenderemos a sacarle partido a esta herramienta.

Los namespaces (o espacios de nombres, por la terminología en español), son contextos que se definen para indicar el ámbito dónde «vive» una clase, u otro script del proyecto. Se definen con el nombre del directorio donde está alojada esa clase, para indicárselo al archivo de autocarga. Por ejemplo, observa el script CrearTelevisorClass.php:

Hemos quitado toda la documentación relativa al funcionamiento interno de la clase, ya que esta no es relevante aquí. Observa, en cambio, las líneas resaltadas al principio. En primer lugar le indicamos al script cual es su espacio de nombres. Ponemos sólo el nombre del directorio classes, ya que el resto de la ruta, incluido el directorio src, es agregado en el archivo autocarga.php.

Además, le indicamos que debe usar «lo que encuentre» en el directorio interfaces, con el nombre interfaceTelevisor. Observa que al nombre del script de la interface tampoco le añadimos la extensión .php, porque también es incluida durante la autocarga. El script interfaceTelevisor.php queda, pues, como ves a continuación:

Una vez más, fíjate que le hemos indicado cuál es su espacio de nombres. En este caso,, no empleamos la sentencia use, porque este script será utilizado por el anterior, pero no hace uso, a su vez, de ningún otro.

En la clase TelevisorOperativoClass debemos definir el espacio de nombres en el que se encuentra, y también la clase de la que hace uso para heredar de ella. El script TelevisorOperativoClass.php queda, por tanto, así:

Una vez más, quédate con la copla de las líneas resaltadas, que en la próxima sección de este artículo entenderás su uso.

Ahora observa el script TelevisorConVideo.php:

Y AQUÍ VIENE LA MAGIA

Aquí es donde cobra sentido todo lo que hemos hecho hasta ahora. Observa el script index.php:

Observa que lo primero que hacemos es cargar el script que se encarga del autoloading de las clases. Cómo te he comentado antes, la función autoload que hemos definido en el mismo se ejecuta de forma transparente. El argumento que recibe, en cada caso, viene definido por el uso de los distintos namespaces. Es por eso que los hemos declarado en cada clase que debe ser autocargada. Es la instrucción use, en cada caso, la que le dice a la función de autocarga que namespace debe cargar. Y todo esto ocurre de forma transparente a nosotros (por eso hablamos de «magia»).

Prueba el script, y verás que funciona perfectamente.

REESTRUCTURANDO EL PROYECTO

Una de las ventajas de emplear este sistema (aparte de conseguir un código más limpio, legible y optimizado) es la facilidad que tenemos para reestructurar todo el proyecto, con un mínimo de cambios en el código. Imagina que ahora quieres cambiar el nombre de tu directorio src a source, por ejemplo. Sólo tienes que hacer dicho cambio, e ir al fichero autoload.php. Sustituye la línea siguiente:

$script = ROOT.DS.'src'.DS.str_replace("\\", DS, $script).'.php';

por

$script = ROOT.DS.'source'.DS.str_replace("\\", DS, $script).'.php';

y ya lo tienes. Ya está todo funcionando, igual que antes, con la nueva estructura.

CONCLUYENDO

El uso de las autocargas puede asustar un poco al principio. Por una parte, el concepto de espacios de nombres es un poco etéreo, y el hecho de que haya una función que se ejecuta automáticamente, sin ser específicamente invocada, quizá lo es aún más. Sin embargo, el pequeño esfuerzo que supone aprender a pensar en este modo, se ve recompensado con creces con los beneficios que obtenemos con esta técnica. Deberías usar los scripts de este artículo (que te dejo en este enlace) para experimentar con ellos. No te importe romperlos, siempre puedes descargar los originales de nuevo. Es practicando, y rompiendo y arreglando código, como se llega a dominar la programación.

   

Deja un comentario