TigerZF
🌐Español

42.7. El StandardAutoloader

42.7.1. Resumen

Zend_Loader_StandardAutoloader está diseñado como un autoloader compatible con PSR-0. Asume una correspondencia 1:1 entre el espacio de nombres+nombre de clase y el sistema de archivos, en la que los separadores de espacio de nombres y los guiones bajos se traducen a separadores de directorio. Una instrucción simple que ilustra cómo funciona la resolución es la siguiente:

$filename = str_replace(array('_', '\\'), DIRECTORY_SEPARATOR, $classname)
          . '.php';

Las encarnaciones anteriores de autoloaders compatibles con PSR-0 en Zend Framework se basaban en el include_path para la búsqueda de archivos. Esto ha provocado varios problemas:

  • Debido al uso de include, si el archivo no se encuentra, se genera una advertencia, incluso si otro autoloader es capaz de resolver la clase posteriormente.

  • Documentar cómo configurar el include_path ha resultado ser un concepto difícil de transmitir.

  • Si existen múltiples instalaciones de Zend Framework en el include_path, gana la primera de la ruta, incluso si esa no era la que el desarrollador pretendía.

Para resolver estos problemas, el StandardAutoloader, por defecto, requiere que registre explícitamente pares de espacio de nombres/ruta (o pares de prefijo de proveedor/ruta), y solo cargará un archivo si existe dentro de la ruta proporcionada. Se pueden proporcionar múltiples pares.

Como medida de último recurso, también puede usar el StandardAutoloader como un autoloader de "reserva" (fallback): uno que buscará clases de cualquier espacio de nombres o prefijo de proveedor en el include_path. Sin embargo, esta práctica no se recomienda debido a las implicaciones de rendimiento.

Finalmente, como con todos los autoloaders en Zend Framework, el StandardAutoloader es capaz de registrarse a sí mismo con el registro de autoloaders SPL de PHP.

[Note] Vocabulario: espacios de nombres frente a prefijos de proveedor

En términos de autoloading, un "espacio de nombres" corresponde a la propia definición de PHP de los espacios de nombres en las versiones 5.3 y posteriores de PHP.

Un "prefijo de proveedor" hace referencia a la práctica, popularizada en versiones de PHP anteriores a la 5.3, de proporcionar un pseudo-espacio de nombres en forma de palabras separadas por guiones bajos en los nombres de clase. Por ejemplo, la clase Phly_Couch_Document usa un prefijo de proveedor "Phly", y un prefijo de componente "Phly_Couch", pero es una clase que reside en el espacio de nombres global dentro de PHP 5.3.

El StandardAutoloader es capaz de cargar tanto nombres de clase con espacio de nombres como con prefijo de proveedor, pero los trata por separado al intentar hacerlos coincidir con una ruta apropiada.

42.7.2. Inicio rápido

El uso básico del StandardAutoloader requiere simplemente registrar pares de espacio de nombres/ruta. Esto se puede hacer tanto en el momento de la instanciación como mediante llamadas explícitas a métodos después de que el objeto haya sido inicializado. Llamar a register() registrará el autoloader con el registro de autoloaders SPL.

Por defecto, la clase registrará el espacio de nombres "Zend" en el directorio superior a donde se encuentra su propio archivo de clase en el sistema de archivos.

Ejemplo 42.7. Configuración manual

// 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/StandardAutoloader.php';
$loader = new Zend_Loader_StandardAutoloader();

// Register the "Phly" namespace:
$loader->registerNamespace('Phly', APPLICATION_PATH . '/../library/Phly');

// Register the "Scapi" vendor prefix:
$loader->registerPrefix('Scapi', APPLICATION_PATH . '/../library/Scapi');

// Optionally, specify the autoloader as a "fallback" autoloader;
// this is not recommended.
$loader->setFallbackAutoloader(true);

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

Ejemplo 42.8. Configuración en la instanciación

El StandardAutoloader también se puede configurar en el momento de la instanciación. Tenga en cuenta:

  • El argumento proporcionado puede ser un array o un objeto Traversable (como un objeto Zend_Config).

  • El argumento proporcionado también es un argumento válido para pasar al método setOptions().

Lo siguiente es equivalente al ejemplo anterior.

require_once 'Zend/Loader/StandardAutoloader.php';
$loader = new Zend_Loader_StandardAutoloader(array(
    'namespaces' => array(
        'Phly' => APPLICATION_PATH . '/../library/Phly',
    ),
    'prefixes' => array(
        'Scapi' => APPLICATION_PATH . '/../library/Scapi',
    ),
    'fallback_autoloader' => true,
));

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

42.7.3. Opciones de configuración

El StandardAutoloader define las siguientes opciones.

Opciones de StandardAutoloader

namespaces

Un array asociativo de pares espacio de nombres/ruta. La ruta debe ser una ruta absoluta o una ruta relativa al script que la invoca, y debe contener solo clases que residan en ese espacio de nombres (o en sus subespacios de nombres). Por defecto, se registra el espacio de nombres "Zend", apuntando al directorio padre del archivo que define el StandardAutoloader.

prefixes

Un array asociativo de pares prefijo de proveedor/ruta. La ruta debe ser una ruta absoluta o una ruta relativa al script que la invoca, y debe contener solo clases que comiencen con el prefijo de proveedor proporcionado.

fallback_autoloader

Un valor booleano que indica si esta instancia debe actuar o no como un autoloader de "reserva" (fallback) (es decir, buscar clases de cualquier espacio de nombres o prefijo de proveedor en el include_path). Por defecto, false.

42.7.4. Métodos disponibles

42.7.5. Ejemplos

Consulte los ejemplos en el inicio rápido para ver su uso.