require_once ‘Autoloading’: PSR-4, PSR-0.

¡Bienvenidos un día más a un nuevo rootie queridos amigos! Otra semana más y aquí estamos con un nuevo post sobre el apasionante mundo de la programación. En el post de hoy vamos a hablar de Autoloading en PHP (y si voy a usar la palabra inglesa todo el post, porque soy así).

Preambulo al autoloading.

Como todo sabéis (y si no bienvenidos a ohmyroot!, pasad, coged una galleta y poneos  cómodos), somos gente que nos encanta el PHP, de hecho nos ganamos las habichuelas con el. Para todos aquellos que programáis en PHP, sabréis que para hacer uso de objetos en otros objetos, tradicionalmente se utilizaba require, require_once, include o include_once .

Estas cuatro sentencias (¡ojo, que no funciones!) se diferencian muy poco entre si, no voy a entrar en detalles, pero básicamente nos permiten incluir código de otros archivos en donde las usemos, con este ejemplo quedará más claro:

Esta técnica es solo viable si tu proyecto no tiene un gran número de clases (aunque yo huiría de esta forma de trabajar), para hacer esto más fácil y mantenible, existe el autoloading.

Autoloading, metiéndonos en harina.

El autoloading, como su nombre indica es una técnica que nos ayudará a cargar automáticamente clases en donde lo necesitemos sin tener que recurrir a utilizar varias veces las citadas sentencias. Esto nos permitirá instanciar objetos sin implícitamente incluir el archivo que contiene dicho objeto.

En PHP autoloading fue introducido en su versión 5 y actualmente hay dos formas de hacerlo, a través de __autoload y la otra es usando spl_autoload_register. El estándar para la implementación de autoloading en aplicaciones (PHP) viene definido por el PHP-FIG en sus versiones PSR-4 y PSR-0 (ya obsoleto)

autoloading psr 0 obsoleto no olvidado
Obsoleto, pero no olvidado, como nuestro querido 600!

La primera opción, actualmente es menos utilizada, pero esta función nos permite el requerir cualquier fichero cuando se instancia el objeto utilizando una clase no definida, veámoslo con un ejemplo.

Como se muestra en el código, no hemos hecho uso de las sentencias require/include para cada archivo, si no que hemos delegado esta tarea a __autoload, aunque como ya he mencionado, este ha sido reemplazado por spl_autoload_register.

All hail to spl_autoload_register!

Como ya he mencionado, __autoload, no es demasiado útil por ejemplo cuando trabajamos en un proyecto como un framework. Por suerte para este tipo de cosas tenemos spl_autoload_register, que nos permite agregar varias funciones en el proceso de autoloading.

Cuando hacemos uso de esta función, básicamente estamos registrado un callback que añade la clase a una cola. Cuando una Clase u objeto es instanciado, sin que esta haya sido definida, PHP ejecuta todas las funciones almacenadas en orden, hasta que encuentra la clase en cuestión.

Es importante saber que una vez el fichero correcto para la clase esta cargado, el resto de funciones en la cola, no serán invocadas, esto en código sería algo así:

Con este ejemplo, podríamos empezar a introducirnos en Autoloading, pero la verdad es un ejemplo un poco burdo y con muy poca elegancia en el código.

Namespaces o Espacios de Nombres

Antes de seguir con el ejemplo final de autoloading, voy a introducir (como bonus track) los namespaces.

básicamente los espacios de nombres son una manera de encapsular elementos.

En el mundo de PHP, los espacios de nombres están diseñados para solucionar dos problemas al crear elementos de código reusable, tales como clases o funciones:

  1. El conflicto de nombres entre el código que se crea y las clases/funciones/constantes internas de PHP o las clases/funciones/constantes de terceros.
  2. La capacidad de apodar (o abreviar) Nombres_Extra_Largos diseñada para aliviar el primer problema, mejorando la legibilidad del código fuente.

Los espacios de nombres de PHP proporcionan una manera para agrupar clases, interfaces, funciones y constantes relacionadas. Fuente documentación Oficial PHP.

Autoloading + Namespaces = Win Win!.

Aunque el ejemplo anterior es un buen ejemplo, y podría servir perfectamente, aun hay formas más elegantes de hacer esto y por ello, voy a compartir con vosotros, mi propia implementación de Autoloader en el marco de mi propio framework PHP. Para ello además del uso de autoloading, hice uso de los Namespaces

Lo primero que hice fue entender donde como debía mi framework realizar el autoloading, para ello decidí crear la clase Autoloader.

Como se ve en el código esta clase hacemos realizamos el autoloading, tal como he explicado, en el post. Pero esta clase así, no me servía de mucho. Por esta razón, decidí aplicar la filosofía de los frameworks y crear un punto en mi proyecto donde cargar todo el entorno (bootstrapping), esto es el archivo bootstrap.php

Y por último para que toda esta configuración tenga sentido, implemente el index.php de la siguiente forma:

Con estos tres ficheros, conseguí configurar el autoloading en mi proyecto, junto con el uso efectivo de los espacios de nombres. Así pues esta solución esta bastante más refinada y ofrece mayor flexibilidad que las de los ejemplos anteriores. Sentiros libres de copiarla y utilizarla esta parte de a vuestro antojo, y si os hace felices, ¡aceptamos donaciones en forma de cerveza!

Para que veáis que no me tiro el rollo, aquí esta una clase real (exceptuando la información sensible) que utiliza mi autoloader:

Y con esto nos despedimos por hoy, ¡con un post en el que solo he sido capaz de meter un solo meme! No os acostumbréis, porque hoy he estado poco inspirado, pero veremos la semana que viene ¡jajaja!.

Como siempre para cualquier duda, pregunta, comentario, soborno o amenaza, podéis usar los comentarios o en nuestras redes sociales Facebook y Twitter.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *