Carga automática de archivos en PHP

Si utilizamos el paradigma de programación orientada a objetos en PHP y solemos almacenar cada nueva clase o interfaz en su propio archivo, lo cuál sería una buena práctica, probablemente nuestro código estará lleno de sentencias include o require con las que importar los archivos de código de las clases e interfaces que vayamos a necesitar.

Una alternativa sería el uso de __autoload, una función “mágica” cuyo código se ejecutará siempre que se intente utilizar una clase o interfaz que no haya sido definida todavía. De esta forma, un código como este:

<?php
require 'Clase1.php';
require 'Clase2.php';
require 'Clase3.php';
require 'Clase4.php';

class MiClase extends Clase1 {
  function procesar() {
    return array(new Clase2(), new Clase3(), new Clase4());
  }
}

podría traducirse en este otro código, mucho más sencillo y con menos necesidad de mantenimiento:

<?php
function __autoload($clase) {
  require_once $clase . '.php';
}

class MiClase extends Clase1 {
  function procesar() {
    return array(new Clase2(), new Clase3(), new Clase4());
  }
}

Para no tener que repetir esta función en cada archivo también podríamos añadirla a un archivo de bootstrap, o usar la directiva de php.ini auto_prepend_file, que añade el código del archivo indicado automáticamente.

auto_prepend_file=autoload.php

Si no podemos modificar php.ini, también podemos establecer el valor a través de .htaccess:

php_value auto_prepend_file “autoload.php”

Si la aplicación es mínimamente compleja, seguramente nuestras clases estarán organizadas en directorios. Una solución para no tener que recorrer todos los subdirectorios de forma recursiva en busca del archivo que contiene la clase o interfaz, lo que podría afectar negativamente al rendimiento, sería seguir la práctica de reflejar la ruta en el nombre de la clase, como suelen hacer en PEAR y Zend Framework, por ejemplo. De esta forma, la clase de Controladores/EjemploControlador.php se llamaría Controladores_EjemploControlador, y podríamos cargarla de la siguiente forma:

function __autoload($clase) {
  $ruta = str_replace('_', '/', $clase);
  require_once  $ruta . '.php';
}

Pero, ¿qué ocurre si trabajamos con código de terceras personas que también hayan hecho uso de __autoload? En PHP 5.1.2 se introdujo una nueva función que nos permite utilizar varias funciones de auto carga, spl_autoload_register. Esta permite añadir la función pasada como parámetro al final de una pila de funciones de auto carga que PHP utilizará cuando no se encuentre una clase o interfaz.

Si no se le pasa ningún parámetro, se registrará la función spl_autoload, una función escrita en C, por lo que es bastante rápida y eficiente, que busca archivos con el mismo nombre de la clase y con extensión .php o .inc, aunque también se pueden indicar otras extensiones con spl_autoload_extensions. Como no busca en carpetas, si queréis utilizar esta implementación, es posible que queráis combinarlo con set_include_path para indicar las carpetas en las que buscar archivos fuente:

set_include_path('una_carpeta:otra_carpeta');


Comentarios
  1. Aether

    Simplemente una belleza, yo también lo utilizo muy seguido en mis proyectos de PHP…. pero siempre se agradece el que mencionaras el __autoload dejarlo automático en php.ini, eso no se me había ocurrido 😛

    Responder

  2. Estoy de acuerdo con Aether. Es simple y muy eficiente, porque ahorra escribir y ahorra en el mantenimiento.

    Además de programador amateur, me considero de “perfil bajo”, y no se me había ocurrido incluir clases para esto de cargar archivos en PHP. Aunque es un muy buen manual, no creo que lo utilice, fundamentalmente porque tengo una seria incapacidad de entender cómo funcionan las clases, no sólo en PHP, también en Python y en cualquier cosa en la que haya que picar código.

    Prefiero la programación estructurada, pero también es cierto que mis proyectos en PHP son sencillas aplicaciones muy fáciles de mantener.

    De cualquier manera, no descarto que en un futuro tenga que echar mano de todos estos conocimientos que plasmas en tus posts. Como siempre, enhorabuena por tu gran trabajo.

    Responder

  3. [DoodoM]

    Definitivamente tú juegas en otra liga distinta que yo en lo referente a conocimientos acumulados. :O

    Desde luego que no hay día en esto de la programación en el que no se aprenda algo nuevo.

    Un saludo y gracias por estar ahí.

    Responder

  4. PELUSITA

    es la primer vez que hare uso de una clase como phplot en PHP, vere si me funciona, pero creo que esta muy bien explicado y es exelente. muchas gracias por escribirlo

    Responder

  5. Exelente!!!!!!!!!!!!!!!!!!!

    Responder

  6. paco

    Usen esto, niños

    Responder

Deja un comentario