TigerZF
🌐Español

4.3. Uso básico del Autoloader

Ahora que tenemos una idea de qué es el autoloading y cuáles son los objetivos y el diseño de la solución de autoloading de Zend Framework, veamos cómo usar Zend_Loader_Autoloader.

En el caso más simple, simplemente requeriría la clase y luego la instanciaría. Dado que Zend_Loader_Autoloader es un singleton (debido a que el autoloader de SPL es un recurso único), usamos getInstance() para obtener una instancia.

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

Por defecto, esto permitirá cargar cualquier clase con los prefijos de namespace "Zend_" o "ZendX_", siempre que estén en su include_path.

¿Qué sucede si tiene otros prefijos de namespace que desea usar? La mejor y más simple manera es llamar al método registerNamespace() en la instancia. Puede pasar un único prefijo de namespace, o un array de ellos:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Foo_');
$loader->registerNamespace(array('Foo_', 'Bar_'));

Alternativamente, puede indicarle a Zend_Loader_Autoloader que actúe como un autoloader de "respaldo" (fallback). Esto significa que intentará resolver cualquier clase sin importar el prefijo de namespace.

$loader->setFallbackAutoloader(true);
[Warning] No lo use como autoloader de respaldo

Aunque resulta tentador usar Zend_Loader_Autoloader como un autoloader de respaldo, no recomendamos esta práctica.

Internamente, Zend_Loader_Autoloader usa Zend_Loader::loadClass() para cargar clases. Ese método usa include() para intentar cargar el archivo de clase indicado. include() devolverá un booleano FALSE si no tiene éxito -- pero también emite una advertencia de PHP. Este último hecho puede dar lugar a algunos problemas:

  • Si display_errors está habilitado, la advertencia se incluirá en la salida.

  • Dependiendo del nivel de error_reporting que haya elegido, también podría saturar sus registros (logs).

Puede suprimir los mensajes de error (la documentación de Zend_Loader_Autoloader detalla esto), pero tenga en cuenta que la supresión solo es relevante cuando display_errors está habilitado; el registro de errores siempre mostrará los mensajes. Por estas razones, recomendamos configurar siempre los prefijos de namespace que el autoloader debe conocer

[Note] Prefijos de namespace frente a namespaces de PHP

En el momento de escribir esto, PHP 5.3 ya ha sido lanzado. Con esa versión, PHP ahora cuenta con soporte oficial de namespaces.

Sin embargo, Zend Framework es anterior a PHP 5.3, y por lo tanto a los namespaces. Dentro de Zend Framework, cuando nos referimos a "namespaces", nos referimos a una práctica mediante la cual las clases se prefijan con un "namespace" de proveedor. Como ejemplo, todos los nombres de clase de Zend Framework se prefijan con "Zend_" -- ese es nuestro "namespace" de proveedor.

Zend Framework planea ofrecer soporte nativo de namespaces de PHP en el autoloader en revisiones futuras, y su propia librería utilizará namespaces a partir de la versión 2.0.0.

Si tiene un autoloader personalizado que desea usar con Zend Framework -- quizás un autoloader de una librería de terceros que también está usando -- puede gestionarlo con los métodos pushAutoloader() y unshiftAutoloader() de Zend_Loader_Autoloader. Estos métodos añadirán o anteponerán, respectivamente, autoloaders a una cadena que se invoca antes de ejecutar el mecanismo interno de autoloading de Zend Framework. Este enfoque ofrece los siguientes beneficios:

  • Cada método toma un segundo argumento opcional, un prefijo de namespace de clase. Esto puede usarse para indicar que el autoloader dado solo debe usarse al buscar clases con ese prefijo de clase. Si la clase que se está resolviendo no tiene ese prefijo, el autoloader se omitirá -- lo que puede llevar a mejoras de rendimiento.

  • Si necesita manipular el registro de spl_autoload(), cualquier autoloader que sea un callback que apunte a métodos de instancia puede plantear problemas, ya que spl_autoload_functions() no devuelve exactamente los mismos callbacks. Zend_Loader_Autoloader no tiene tal limitación.

Los autoloaders gestionados de esta manera pueden ser cualquier callback válido de PHP.

// Append function 'my_autoloader' to the stack,
// to manage classes with the prefix 'My_':
$loader->pushAutoloader('my_autoloader', 'My_');

// Prepend static method Foo_Loader::autoload() to the stack,
// to manage classes with the prefix 'Foo_':
$loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');