TigerZF
🌐Español

Capítulo 42. Zend_Loader

Tabla de contenidos

42.1. Carga dinámica de archivos y clases
42.1.1. Carga de archivos
42.1.2. Carga de clases
42.1.3. Comprobación de si un archivo es legible
42.1.4. Uso del autoloader
42.2. El autoloader
42.2.1. Uso del autoloader
42.2.2. Selección de una versión de Zend Framework
42.2.3. La interfaz Autoloader
42.2.4. Referencia del autoloader
42.3. Autoloaders de recursos
42.3.1. Uso del autoloader de recursos
42.3.2. El autoloader de recursos de módulos
42.3.3. Uso de autoloaders de recursos como fábricas de objetos
42.3.4. Referencia del autoloader de recursos
42.4. Carga de plugins
42.4.1. Caso de uso básico
42.4.2. Manipulación de rutas de plugins
42.4.3. Comprobación de plugins y recuperación de nombres de clase
42.4.4. Obtención de mejor rendimiento para los plugins
42.5. La interfaz SplAutoloader
42.5.1. Resumen
42.5.2. Inicio rápido
42.5.3. Opciones de configuración
42.5.4. Métodos disponibles
42.5.5. Ejemplos
42.6. El AutoloaderFactory
42.6.1. Resumen
42.6.2. Inicio rápido
42.6.3. Opciones de configuración
42.6.4. Métodos disponibles
42.6.5. Ejemplos
42.7. El StandardAutoloader
42.7.1. Resumen
42.7.2. Inicio rápido
42.7.3. Opciones de configuración
42.7.4. Métodos disponibles
42.7.5. Ejemplos
42.8. El ClassMapAutoloader
42.8.1. Resumen
42.8.2. Inicio rápido
42.8.3. Opciones de configuración
42.8.4. Métodos disponibles
42.8.5. Ejemplos
42.9. La utilidad de generación de mapas de clases: bin/classmap_generator.php
42.9.1. Resumen
42.9.2. Inicio rápido
42.9.3. Opciones de configuración

42.1. Carga dinámica de archivos y clases

La clase Zend_Loader incluye métodos para ayudarle a cargar archivos de forma dinámica.

[Tip] Zend_Loader frente a require_once()

Los métodos de Zend_Loader se usan mejor si el nombre del archivo que necesita cargar es variable. Por ejemplo, si se basa en un parámetro procedente de la entrada del usuario o de un argumento de método. Si está cargando un archivo o una clase cuyo nombre es constante, no hay ningún beneficio en usar Zend_Loader en lugar de las funciones tradicionales de PHP como require_once().

42.1.1. Carga de archivos

El método estático Zend_Loader::loadFile() carga un archivo PHP. El archivo cargado puede contener cualquier código PHP. El método es un envoltorio para la función PHP include(), que emite un aviso de PHP en caso de fallo, por ejemplo si el archivo especificado no existe.

Ejemplo 42.1. Ejemplo del método loadFile()

Zend_Loader::loadFile($filename, $dirs=null, $once=false);

El argumento $filename especifica el nombre de archivo a cargar, que no debe contener ninguna información de ruta. Se realiza una comprobación de seguridad sobre $filename. $filename solo puede contener caracteres alfanuméricos, guiones ("-"), guiones bajos ("_") o puntos ("."). No se impone ninguna restricción de este tipo sobre el argumento $dirs.

El argumento $dirs especifica en qué directorios buscar el archivo. Si el valor es NULL, solo se busca en el include_path; si el valor es una cadena o un array, se buscará en el directorio o directorios especificados, seguidos del include_path.

El argumento $once es un booleano. Si es TRUE, Zend_Loader::loadFile() usa la función PHP include_once() para cargar el archivo; en caso contrario se usa la función PHP include().

42.1.2. Carga de clases

El método estático Zend_Loader::loadClass($class, $dirs) carga un archivo PHP y luego comprueba la existencia de la clase.

Ejemplo 42.2. Ejemplo del método loadClass()

Zend_Loader::loadClass('Container_Tree',
    array(
        '/home/production/mylib',
        '/home/production/myapp'
    )
);

La cadena que especifica la clase se convierte en una ruta relativa sustituyendo los guiones bajos por separadores de directorio de su sistema operativo, y añadiendo '.php'. En el ejemplo anterior, 'Container_Tree' se convierte en 'Container\\Tree.php' en Windows.

Si $dirs es una cadena o un array, Zend_Loader::loadClass() busca en los directorios en el orden proporcionado. Se carga el primer archivo coincidente. Si el archivo no existe en los $dirs especificados, entonces se busca en el include_path del entorno PHP.

Si el archivo no se encuentra o la clase no existe tras la carga, Zend_Loader::loadClass() lanza una Zend_Exception.

Zend_Loader::loadFile() se usa para la carga, por lo que el nombre de la clase solo puede contener caracteres alfanuméricos y el guion ('-'), el guion bajo ('_') y el punto ('.').

[Note] Carga de clases desde espacios de nombres de PHP

A partir de la versión 1.10.0, Zend Framework permite ahora cargar clases desde espacios de nombres de PHP. Este soporte sigue las mismas directrices e implementación que se encuentran en la implementación de referencia PHP Framework Interop Group PSR-0.

Según esta directriz, se aplican las siguientes reglas:

  • Cada separador de espacio de nombres se convierte en un DIRECTORY_SEPARATOR al cargar desde el sistema de archivos.

  • Cada carácter "_" en el NOMBRE DE CLASE se convierte en un DIRECTORY_SEPARATOR. El carácter "_" no tiene ningún significado especial en el espacio de nombres.

  • El espacio de nombres y la clase completamente calificados se sufijan con ".php" al cargar desde el sistema de archivos.

Como ejemplos:

  • \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

  • \namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php

  • \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

42.1.3. Comprobación de si un archivo es legible

El método estático Zend_Loader::isReadable($pathname) devuelve TRUE si existe un archivo en la ruta especificada y es legible, y FALSE en caso contrario.

Ejemplo 42.3. Ejemplo del método isReadable()

if (Zend_Loader::isReadable($filename)) {
    // do something with $filename
}

El argumento $filename especifica el nombre de archivo a comprobar. Puede contener información de ruta. Este método es un envoltorio para la función PHP is_readable(). La función PHP no busca en el include_path, mientras que Zend_Loader::isReadable() sí lo hace.

42.1.4. Uso del autoloader

La clase Zend_Loader contiene un método que puede registrar con el autoloader SPL de PHP. Zend_Loader::autoload() es el método de callback. Como comodidad, Zend_Loader proporciona la función registerAutoload() para registrar su método autoload(). Si la extensión spl_autoload no está presente en su entorno PHP, entonces el método registerAutoload() lanza una Zend_Exception.

Ejemplo 42.4. Ejemplo de registro del método de callback del autoloader

Zend_Loader::registerAutoload();

Tras registrar el callback de autocarga de Zend Framework, puede hacer referencia a clases de Zend Framework sin tener que cargarlas explícitamente. El método autoload() usa Zend_Loader::loadClass() automáticamente cuando usted hace referencia a una clase.

Si ha extendido la clase Zend_Loader, puede proporcionar un argumento opcional a registerAutoload(), para especificar la clase desde la cual registrar un método autoload().

Ejemplo 42.5. Ejemplo de registro del método de callback de autocarga desde una clase extendida

Debido a la semántica de las referencias de funciones estáticas en PHP, debe implementar código tanto para loadClass() como para autoload(), y autoload() debe llamar a self::loadClass(). Si su método autoload() delega en su padre para llamar a self::loadClass(), entonces llama al método de ese nombre en la clase padre, no en la subclase.

class My_Loader extends Zend_Loader
{
    public static function loadClass($class, $dirs = null)
    {
        parent::loadClass($class, $dirs);
    }

    public static function autoload($class)
    {
        try {
            self::loadClass($class);
            return $class;
        } catch (Exception $e) {
            return false;
        }
    }
}

Zend_Loader::registerAutoload('My_Loader');

Puede eliminar un callback de autocarga. El método registerAutoload() tiene un segundo argumento opcional, que es TRUE por defecto. Si este argumento es FALSE, el callback de autocarga se elimina de la pila de autocarga de SPL.