Autoloader

1. Sistema de Carga Automática (Autoloading)

  • PSR-4 Compatible: Soporte para estructura de directorios según el estándar PSR-4.

  • Búsqueda Recursiva: Fallback recursivo en directorios si no se encuentra la clase en la estructura PSR-4.

  • On-Demand: Carga clases solo cuando son requeridas (no carga todo al inicio).


2. Sistema de Caché Avanzado

  • Almacenamiento por FQCN: Usa el Fully Qualified Class Name como clave en el caché.

  • Persistencia en Disco: Guarda el caché en un archivo (autoloader_cache.dat) entre ejecuciones.

  • Auto-Limpieza: Elimina entradas inválidas si el archivo de clase no existe.

  • Regeneración Manual: Método rebuildClassmap() para precargar todas las clases.


3. Manejo de Rutas

  • Múltiples Paths: Soporta múltiples directorios de búsqueda con addPath().

  • Rutas Reales: Usa realpath() para evitar problemas con rutas relativas/simbólicas.


4. Diagnóstico y Depuración

  • Logs Detallados: Mensajes de depuración con timestamp (activables con enableDebug()).

  • Método de DiagnósticodiagnoseClassLoading() para identificar problemas de carga.

  • Detección de Clases: Verifica nombres de clases, interfaces y traits con análisis de tokens PHP.


5. Optimizaciones

  • Singleton: Solo una instancia por aplicación (patrón Singleton).

  • Evita Cargas Duplicadas: Registra archivos ya cargados con require_once.

  • Cache Opcional: Puede desactivarse con enableCache(false).


6. Seguridad y Robustez

  • Validación de Archivos: Verifica que los archivos existan antes de cargarlos.

  • Manejo de Errores: Silencia errores con @ en operaciones críticas (ej: file_get_contents).

  • Exclusión de Puntos (.): Ignora directorios . y .. en búsquedas recursivas.


7. Extensibilidad

  • Cache Personalizable: Permite inyectar implementaciones de caché externas con setCache().

  • Force Load: Carga manual de archivos específicos con forceLoad().


8. Soporte para Estructuras Complejas

  • Namespaces Anidados: Detecta correctamente clases en namespaces multinivel.

  • Clases/Interfaces/Traits: Soporte para los tres tipos de estructuras PHP.



Ejemplo de uso en diferentes escenarios:

1. Configuración básica (desarrollo):

php
require_once 'Autoloader.php';

$autoloader = Autoloader::getInstance(__DIR__.'/src')
    ->enableDebug()      // Mostrar mensajes de depuración
    ->addPath(__DIR__.'/lib')  // Añadir rutas adicionales
    ->register();        // Registrar el autoloader

2. Configuración para producción:

php
require_once 'Autoloader.php';

$autoloader = Autoloader::getInstance(__DIR__.'/src')
    ->enableCache()     // Habilitar caché (activado por defecto)
    ->register();

// Reconstruir el classmap durante el despliegue
$autoloader->rebuildClassmap();

3. Script para reconstruir el classmap (rebuildClassMap.php):

php
#!/usr/bin/env php
<?php
require __DIR__.'/Autoloader.php';

echo "Rebuilding autoloader classmap...\n";

$autoloader = Autoloader::getInstance(__DIR__.'/src')
    ->addPath(__DIR__.'/vendor')
    ->enableCache();

$autoloader->rebuildClassmap();

echo "Classmap rebuilt successfully!\n";
echo "Total cached classes: " . count($autoloader->diagnoseClassLoading('')) . "\n";

4. Diagnóstico de problemas:

php
// Cuando una clase no se carga correctamente 

echo $autoloader->diagnoseClassLoading('My\\Problematic\\Class'); 

Comentarios

Entradas populares de este blog

Gramatica