Autoload de clases en PHP

Conforme crecen nuestros proyectos, también crece el número de clases de los mismos y muchas veces es difícil saber qué clases tienen que estar cargadas en memoria en cada acción de nuestro proyecto.

Una opción que muchos hacen es, simplemente, cargarlo todo, que así seguro que no falla nada. Esto en proyectos medianos no es muy grave pero en entornos con muchas clases y mucha actividad puede dar problemas de memoria.

Muchos frameworks ya se encargan de hacer esta función por nosotros, algunos de forma más óptima que otros, pero está bien saber cómo funciona y qué opciones tenemos.

Básicamente el autoload es una especie de última opción de cargar un archivo que necesitamos y funciona de la siguiente manera: Cuando se necesita una clase (haciendo un new, en un extends, un implements, etc…) si la clase no está cargada se llama a la función mágica __autoload con el nombre de la clase como parámetro.

<?php
   // Esto sería el archivo classes/db.class.php
  class DB {
     // Todo el código de la clase
  }
?>
<?php
   // Esto sería el archivo classes/noticias.class.php
  class Noticias {
     // Todo el código de la clase
  }
?>
<?php
   // Esto sería por ejemplo el index.php
   function __autoload($name) {
      // En $name llega el texto 'DB' y 'Noticias'
      $fullpath = 'classes/'.strtolower($name).'.class.php';
      if(file_exists($fullpath)) require_once($fullpath);
   }
   // No tenemos hecho el require de los archivos pero se llamará a __autoload
   $db = new DB();
   $noticias = new Noticias();
?>

Por supuesto, tenemos que ser ordenados con el código, vaya que si a una clase la llamamos class Pepito y lo guardamos en el archivo Juanito.class.php esto no va a funcionar de ninguna manera!

Yo, por ejemplo, suelo hacer lo siguiente:

– Archivos en carpetas controladas, con nombres todo en minusculas “<nomclase>.class.php”
– El nombre de la clase con alguna mayúscula

Y con esto conseguimos que siempre estén cargadas solamente aquellas clases que lo necesiten, optimizando la memoria usada por nuestra aplicación. Y no os preocupéis por cuanto tarda en saltar el __autoload, aunque algo tarda, es el menor de nuestros problemas ya que solamente se ejecuta la primera vez que necesitamos la clase!

En proyectos bastante complejos, puede ser interesante tener varios autoload, esto se puede hacer de la siguiente manera, con la función spl_autoload_register, disponible a partir de PHP 5.1.2.

<?php
    spl_autoload_register('second_autoload');
    function second_autoload($name) {
        // $name llega de la misma manera que en __autoload y aquí veremos qué hacer con ese nombre
        // y como recuperar el archivo donde está la clase!
    }
    // Al no tener el require hecho, primero intentará buscar la función __autoload y después a 
    // aquellas funciones pasadas a través de spl_autoload_register
    $otraclase = new Otraclase();
?>

IMPORTANTE: A partir de PHP 5.3 la función spl_autoload_register tiene dos parámetros optativos:

bool spl_autoload_register ([ callback $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

Con el parámetro $throw a true, la función lanzará excepciones si se produce un error, puede interesarnos deshabilitarlo (aunque no lo veo muy claro).

Y para mí, el más interesante es el segundo parámetro que nos permite que este nuevo autoload vaya antes que la __autoload (en vez del comportamiento normal descrito en el ejemplo de código).

Sé que esto no es nuevo para la mayoría pero espero que todos hayáis aprendido algo!

Terminadas las vacaciones de Navidad prometo actualizar más a menudo.

En cualquier caso, espero que hayáis pasado unas felices fiestas!

You may also like...