Cargando archivos y clases dinámicamente
La clase
Zend_Loader
incluye métodos para ayudar a cargar archivos
dinámicamente.
Zend_Loader vs. require_once()
Los métodos de
Zend_Loader
tienen más utilidad si el
nombre de archivo que necesita cargar es variable. Por ejemplo,
si éste se basa en un parametro de entrada del usuario o argumento
de un método. Si carga
un archivo o clase cuyo nombre es constante, no
hay ningún beneficio al usar
Zend_Loader
sobre el uso
de funciones tradicionales de
PHP
como
require_once()
.
Cargando 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 se comporta como un envoltorio para la función
PHP
include()
.
Este método devuelve un booleano
FALSE
en caso de fallo, por ejemplo,
si el archivo especificado no existe.
Ejemplo del Método loadFile()
El argumento
$filename
especifica el archivo que se va a cargar,
el cual no debe contener ninguna información de
rutas.
Una verificación de seguridad es efectuada sobre
$filename
.
El archivo
$filename
sólo puede contener caracteres alfanuméricos,
guiones ("-"), barras bajas ("_"), o puntos
(".").
No hay ninguna restricción en el argumento
$dirs
.
El parámetro
$dirs
especifica en qué carpetas buscar el archivo.
Si el valor es
NULL
, sólo se buscará en el
include_path
; si el valor es un string o un array, se buscará en la carpeta o carpetas especificadas
, seguidas del
include_path
.
El argumento
$once
es un booleano. Si es
TRUE
,
Zend_Loader::loadFile()
esa la función
PHP
include_once()
para cargar el archivo, de lo contrario se utiliza la función
PHP
include()
.
Cargando Clases
El método estático
Zend_Loader::loadClass($class, $dirs)
carga un archivo
PHP
y comprueba la existencia de la clase.
Ejemplo del método loadClass()
La cadena que especifica la clase es convertida a una ruta relativa sustituyendo las
barras
bajas (_) por el separador de carpeta de su Sistema Operativo, y añadiendo
'.php'.
En el ejemplo de arriba, 'Container_Tree' se convierte en 'Container\\Tree.php' en
Windows.
Si
$dirs
es una cadena o un array,
Zend_Loader::loadClass()
busca las carpetas en el
orden suministrado. El primer archivo encontrado es cargado. Si
el archivo
no existe en el
$dirs
especificado, entonces se busca en el
include_path
del entorno
PHP
.
Si el archivo no es encontrado o la clase no existe después de la carga,
Zend_Loader::loadClass()
lanza una
Zend_Exception
.
Zend_Loader::loadFile()
se usa para cargar, así que
el nombre de la clase puede contener únicamente caracteres
alfanuméricos,
guiones ('-'), barras bajas ('_'), y puntos ('.').
Comprobando si un Archivo Puede Ser Leído
El método estático
Zend_Loader::isReadable($pathname)
devuelve
TRUE
si el archivo en la ruta $pathname existe
y tiene permisos de lectura,
FALSE
en caso contrario.
Ejemplo del método isReadable()
El argumento
$filename
especifica el nombre de archivo que
comprobar. Puede contener información de la ruta.
Este método envuelve la función
PHP
is_readable()
.
La función
PHP
no busca en
include_path
,
mientras que
Zend_Loader::isReadable()
sí.
Usando el Autoloader
La clase
Zend_Loader
contiene un método que se puede registrar
con
PHP
SPL autoloader.
Zend_Loader::autoload()
es el método
callback. Por comodidad,
Zend_Loader
permite a la función
registerAutoload()
registrar su método
autoload()
. Si la extensión
spl_autoload
no está presente en el entorno
PHP
, entonces el método
registerAutoload()
lanza una
Zend_Exception
.
Ejemplo de registro del método callback del autoloader
Después de registrar el callback de autoload de Zend Framework, se pueden
referenciar
clases de Zend Framework sin tener que cargarlas
explícitamente. El método
autoload()
usa automáticamente
Zend_Loader::loadClass()
cuando referencie una clase.
Si ha extendido la clase
Zend_Loader
, se puede pasar un
argumento opcional a
registerAutoload()
, para especificar
la clase a partir de la cual registrar un método
autoload()
.
Ejemplo de registro del método de callback autoload desde una clase
extendida
Debido a la semántica de referencia de funciones estáticas en
PHP
,
se debe implementar código tanto para la clase
loadClass()
como
autoload()
, y
autoload()
debe llamar a
self::loadClass()
. Si su método
autoload()
delega en su padre la llamada a
self::loadClass()
, entonces llamará
al método con ese nombre en la clase padre, no la subclase.
Se puede eliminar un callback de autoload.
registerAutoload()
tiene un segundo parámetro opcional,
que es
TRUE
por defecto. Si este parámetro es
FALSE
, el callback de autoload será borrado de la pila
de autoload SPL.