Autoloading en PHP

badges_phpstandards_Stage3

En la anterior entrada sobre Namespaces en PHP vimos lo conveniente de usar namespaces para dividir nuestra aplicación en diferentes “espacios” en los que ubicar clases, constantes, variables y funciones. Esto nos ayuda a segmentar y organizar nuestra aplicación si optamos por emplear una convención muy usada como es la de incluir clases en namespaces y usar un único .php para cada una de ellas.

A la hora de incluir clases en nuestro código .php, si optamos por la convención anterior, tendríamos que hacer lo siguiente en nuestro .php:

Donde el contenido de classes/mail.php es:

Afortunadamente hay una forma más conveniente y cómoda de incluir clases en PHP; autoloading.

Autoloading

Existe una función “mágica” en PHP llamada __autoload() que será llamada cada vez que desde nuestro código tratemos de acceder a una clase que no se encuentra en el .php actual pasando como argumento el nombre de dicha clase.

Supongamos que todas nuestras clases están en el directorio MyClasses, veamos un ejemplo de como usar esta función para implementar un mecanismo para auto cargar clases:

MyClasses/UrlValidator.php

main.php

Este uso de __autoload() nos permite cargar clases sin necesidad de llenar nuestro código con require o include.

Autoloading con namespaces

Si en nuestro código hacemos uso del operador use para referenciar a una clase y después tratamos de acceder a ella sin que esta haya sido incluida (vía require o include), php ejecutará __autoload() pasando como argumento una cadena que añade al nombre de la clase su namespace.

En el ejemplo anterior de autoloading simple vimos que la localización de los .php de las clases estaba codificada en la propia función (directorio MyClasses), si decidimos usar una convención tal que nuestras rutas de namespaces coincidan con la ruta de los ficheros .php tenemos un mecanismo de auto carga más versatil y consistente.

A continuación un código de ejemplo que implementa esto:

MyClasses/EmailValidator.php

main.php

Por último comentar que existen unos estándares, PSR-0 y PSR-4, que especifican en detalle los requerimientos para la implementación de este mecanismo y, por ser ampliamente usado en la comunidad de PHP, facilita que no hayan problemas a la hora de incorporar código de terceros.

Acerca de

Ver todas las entradas de