TigerZF
🌐Español

42.8. El ClassMapAutoloader

42.8.1. Resumen

El ClassMapAutoloader está diseñado pensando en el rendimiento. La idea detrás de él es sencilla: cuando se le pide cargar una clase, comprueba si está en el mapa y, si es así, carga el archivo asociado a la clase en el mapa. Esto evita operaciones innecesarias en el sistema de archivos, y también puede asegurar que el autoloader "juegue bien" con las cachés de opcode y la caché de realpath de PHP.

Para usar el ClassMapAutoloader, primero necesita mapas de clases. Zend Framework también proporciona una herramienta para generar estos mapas de clases; puede encontrarla en bin/classmap_generator.php de la distribución. La documentación completa de esta herramienta se ofrece en Sección 42.9, “The Class Map Generator utility: bin/classmap_generator.php”.

42.8.2. Inicio rápido

El primer paso es generar un archivo de mapa de clases. Puede ejecutarlo sobre cualquier directorio que contenga código fuente en cualquier lugar debajo de él.

php classmap_generator.php Some/Directory/

Esto creará un archivo llamado Some/Directory/autoload_classmap.php, que es un archivo PHP que devuelve un array asociativo que representa el mapa de clases.

Dentro de su código, ahora instanciará el ClassMapAutoloader, y le proporcionará la ubicación del mapa.

// This example assumes ZF is on your include_path.
// You could also load the autoloader class from a path relative to the
// current script, or via an absolute path.
require_once 'Zend/Loader/ClassMapAutoloader.php';
$loader = new Zend_Loader_ClassMapAutoloader();

// Register the class map:
$loader->registerAutoloadMap('Some/Directory/autoload_classmap.php');

// Register with spl_autoload:
$loader->register();

Llegado este punto, ya puede usar cualquier clase referenciada en su mapa de clases.

42.8.3. Opciones de configuración

El ClassMapAutoloader define las siguientes opciones.

Opciones de ClassMapAutoloader

$options

El ClassMapAutoloader espera un array de opciones, donde cada opción es un nombre de archivo que referencia un mapa de clases, o un array asociativo de pares nombre de clase/nombre de archivo.

Como ejemplo:

// Configuration defining both a file-based class map, and an array map
$config = array(
    __DIR__ . '/library/autoload_classmap.php', // file-based class map
    array(                                      // array class map
        'Application_Bootstrap' => __DIR__ . '/application/Bootstrap.php',
        'Test_Bootstrap'        => __DIR__ . '/tests/Bootstrap.php',
    ),
);

42.8.4. Métodos disponibles

42.8.5. Ejemplos

Ejemplo 42.9. Uso de configuración para inicializar ClassMapAutoloader

A menudo, querrá configurar su ClassMapAutoloader. Estos valores pueden provenir de un archivo de configuración, una caché (como ShMem o memcached), o un simple array de PHP. Lo siguiente es un ejemplo de un array de PHP que podría usarse para configurar el autoloader:

// Configuration defining both a file-based class map, and an array map
$config = array(
APPLICATION_PATH . '/../library/autoload_classmap.php', // file-based class map
    array(                              // array class map
        'Application_Bootstrap' => APPLICATION_PATH . '/Bootstrap.php',
        'Test_Bootstrap'        => APPLICATION_PATH . '/../tests/Bootstrap.php',
    ),
);

Una configuración equivalente en estilo INI podría verse así:

classmap.library = APPLICATION_PATH "/../library/autoload_classmap.php"
classmap.resources.Application_Bootstrap = APPLICATION_PATH "/Bootstrap.php"
classmap.resources.Test_Bootstrap = APPLICATION_PATH "/../tests/Bootstrap.php"

Una vez que tenga su configuración, puede pasarla al constructor del ClassMapAutoloader, a su método setOptions(), o a registerAutoloadMaps().

/* The following are all equivalent */

// To the constructor:
$loader = new Zend_Loader_ClassMapAutoloader($config);

// To setOptions():
$loader = new Zend_Loader_ClassMapAutoloader();
$loader->setOptions($config);

// To registerAutoloadMaps():
$loader = new Zend_Loader_ClassMapAutoloader();
$loader->registerAutoloadMaps($config);