Imaginemos que organizamos nuestro código en diferentes archivos, cada uno con una clase y con el nombre de la clase como nombre del archivo. Por ejemplo, UnaClase.php y OtraClase.php contendrán las definiciones de class UnaClase y class OtraClase repectivamente. Para inicializar estas clases desde otro script podríamos hacer algo así:
En lugar de tener que cargar (en inglés load) cada una de las clases de nuestra aplicación manualmente, podemos registrar un autoloader. Como su nombre indica, el autoloader está destinado a cargar de forma automática las clases utilizadas. Cada vez que se intenta inicializar una clase y la clase no existe, el nombre de esta clase se pasa al autoloader y este es ejecutado. En el autoloader podremos automatizar el proceso de carga sin tener que incluir manualmente cada archivo y además nos permite hacer el código más rápido, pues sólo se cargarán las clases que efectivamente se utilicen.
Para registrar un autoloader se utiliza la función spl_autoload_register()pasando como primer parámetro la función que hará de autoloader:
Olvídate de __autoload
Si no defines tu propio autoloader como hemos hecho anteriormente, puedes utilizar el método mágico __autoload():
// incluir los archivos que contienen las clases
include_once 'UnaClase.php';
include_once 'OtraClase.php';
// inicializar los objetos
$objeto1 = new UnaClase();
$objeto2 = new OtraClase();
Todo perfecto. Sigues trabajando en la aplicación y vas definiendo nuevas clases en cada vez más archivos que tienes acordarte de incluir en tu script:// incluir los archivos que contienen las clases
include_once 'UnaClase.php';
include_once 'OtraClase.php';
include_once 'MasClase.php';
include_once 'CuartaClase.php';
include_once 'YtodaviamasClase.php';
// inicializar los objetos
$objeto1 = new UnaClase();
$objeto2 = new OtraClase();
$objeto3 = new MasClase();
//...
No hay nada de malo en el código anterior, funcionará perfectamente. Asegúrate de incluir todos los archivos y no tendrás ningún problema. Pero, ¿y si no siempre los necesito todos?. Da igual, cárgalos todos por si acaso o haz condicionales para su carga. ¿Y si tengo 50 archivos? Pues tendrás que hacer 50 include. Vaya coñazo, que incomodidad; y como se me olvide algún archivo …. Fatal ERROR al canto.Autoloaders al rescate!!!!
En lugar de tener que cargar (en inglés load) cada una de las clases de nuestra aplicación manualmente, podemos registrar un autoloader. Como su nombre indica, el autoloader está destinado a cargar de forma automática las clases utilizadas. Cada vez que se intenta inicializar una clase y la clase no existe, el nombre de esta clase se pasa al autoloader y este es ejecutado. En el autoloader podremos automatizar el proceso de carga sin tener que incluir manualmente cada archivo y además nos permite hacer el código más rápido, pues sólo se cargarán las clases que efectivamente se utilicen.
Para registrar un autoloader se utiliza la función spl_autoload_register()pasando como primer parámetro la función que hará de autoloader:
//Registramos mi_autoloader() como callback que se ejecutará
//al intentar inicializar una clase que no existe
spl_autoload_register('mi_autoloader');
//implementamos mi_autoloader(), que recibe el nombre de la clase
//que se ha intentado inicializar
function mi_autoloader( $NombreClase ) {
include_once $NombreClase . '.php';
}
Desde PHP 5.3.0 podemos utilizar funciones anónimas:spl_autoload_register( funcion( $NombreClase ) {
include_once $NombreClase . '.php';
} );
// inicializar los objetos
$objeto1 = new UnaClase();
$objeto2 = new OtraClase();
if( $alguna_condicion ) {
// Ganamos en performance. MasClase.php solo se cargará
// si se verifica $alguna_condicion y llegamos hasta este punto
$objeto3 = new MasClase();
}
Cómo ves, es necesario conocer los nombres de los archivos que se necesitan cargar. Por eso es muy importante seguir unas reglas fijas de nomenclatura de clases y archivos. El ejemplo anterior de utilizar una sola clase por cada archivo y dar al archivo el mismo nombre que la clase sería una regla aceptable. Puedes seguir tus propias reglas aunque es recomendable utilizar reglas estandarizadas y de amplio uso, por ejemplo el estándar PSR-4.Olvídate de __autoload
Si no defines tu propio autoloader como hemos hecho anteriormente, puedes utilizar el método mágico __autoload():
function __autoload( $nombreclass ) {
//incluir el archivo de la clase
include_one $nombreclass . '.php';
}
// inicializar los objetos
$objeto1 = new UnaClase();
$objeto2 = new OtraClase();
Se puede decir que __autoload sería el autoloader por defecto. Sin embargo, tal y como se menciona en la documentación de PHP sobre autocarga de clases, se recomienda spl_autoload_register por su mayor flexibilidad, pero además advierte que __autoload puede ser marcado como obsoleto o eliminarse en el futuro, así que olvídate ya de este método y utiliza siempre spl_autoload_register.
Comentarios