[Tutorial PHP] Carga dinámica de clases al crear los objetos.
Aunque en muchos ejemplos he mostrado las clases dentro del mismo script donde ejecutaba sus métodos, esto no es lo adecuado (ya lo comenté en su momento), lo ideal realmente es tener un fichero por separado donde su nombre sea exactamente el nombre de la clase que contiene para así localizarlo de una forma rápida y ordenada.
Esto nos lleva a tener que incluir o mas bien “requerir” cada uno de los ficheros donde se alojen las clases que vamos a necesitar para realizar nuestros scripts. Esta, sin duda es la forma correcta de hacerlo, por cada tipo de clase que usemos hemos de añadir un require_once al comienzo del script, no es solo por el buen funcionamiento del script, si no también porque de un solo vistazo a la cabecera del script seremos capaces de ver que objetos usa e intuir su cometido.
Pero como siempre, en casi todo lo que se puede hacer en el mundo del desarrollo disponemos de otra forma de realizarlo. En PHP contamos con la función __autoload, si, he dicho función y no método, porque esta función no se sitúa en el cuerpo de ninguna clase, va fuera de ellas.
Su misión principal es la de cargar de forma dinámica las clases que usemos en el script pero que no tenemos incluidas de primera mano. Hay que pasarle un parámetro con el nombre de la clase, pero lo bueno es que además de permitirnos incluir las clases, también nos deja ejecutar otras rutinas, por ejemplo para escribir en nuestro sistema de logs que hemos cargado la clase ‘MiClase‘. Veamos un ejemplo, por un lado tenemos la clase ‘MiClase‘ almacenada en el script ‘MiClase.php‘ en el mismo directorio:
Por otro lado tenemos un script que incluye la función __autoload indicándole que compruebe si existe el script de la clase que intentamos instanciar:
Como se aprecia en el ejemplo, se consigue instanciar ‘MiClase‘ sin ningún problema sin tener que incluir el script al principio, pero en el caso de la clase ‘NoExisto‘ recibimos un ‘FATAL ERROR‘ debido a que el script que hemos pedido no existe.
Podemos alterar al ruta como queramos para buscar los scripts en el directorio que necesitemos, o hacer la comprobaciones pertinentes, en este caso he comprobado mediante file_exists si realmente existe la clase.
Algo que quizás sea llamativo es el hecho de usar include en vez de include_once en el interior de autoload. Esto tiene una explicación, no es necesario include_once porque al llamar dinamicamente el script este solo se llamara una vez por clase, por lo tanto la siguiente vez el script ya estará incluido y autoload no volverá a dispararse. Una buena practica podría ser sustituir el include por un require de forma que no dejemos que se ejecute el script si no se encuentra el fichero en cuestión.