1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 20243 -->
4 <sect1 id="zend.loader.load">
6 <title>Cargando archivos y clases dinámicamente</title>
8 <para> La clase <classname>Zend_Loader</classname> incluye métodos para
9 ayudar a cargar archivos dinámicamente. </para>
12 <title>Zend_Loader vs. require_once()</title>
13 <para> Los métodos de <classname>Zend_Loader</classname> tienen más
14 utilidad si el nombre de archivo que necesita cargar es variable.
15 Por ejemplo, si éste se basa en un parametro de entrada del usuario
16 o argumento de un método. Si carga un archivo o clase cuyo nombre es
17 constante, no hay ningún beneficio al usar
18 <classname>Zend_Loader</classname> sobre el uso de funciones
19 tradicionales de <acronym>PHP</acronym> como <ulink
20 url="http://php.net/require_once">
21 <methodname>require_once()</methodname>
25 <sect2 id="zend.loader.load.file">
27 <title>Cargando Archivos</title>
29 <para> El método estático
30 <methodname>Zend_Loader::loadFile()</methodname> carga un
31 archivo <acronym>PHP</acronym> . El archivo cargado puede contener
32 cualquier código <acronym>PHP</acronym> . El método se comporta como
33 un envoltorio para la función <acronym>PHP</acronym>
34 <ulink url="http://php.net/include">
35 <methodname>include()</methodname>
36 </ulink> . Este método devuelve un booleano
37 <constant>FALSE</constant> en caso de fallo, por ejemplo, si el
38 archivo especificado no existe. </para>
40 <example id="zend.loader.load.file.example">
41 <title>Ejemplo del Método loadFile()</title>
42 <programlisting language="php"><![CDATA[
43 Zend_Loader::loadFile($filename, $dirs=null, $once=false);
47 <para> El argumento <varname>$filename</varname> especifica el archivo
48 que se va a cargar, el cual no debe contener ninguna información de
49 rutas. Una verificación de seguridad es efectuada sobre
50 <varname>$filename</varname> . El archivo
51 <varname>$filename</varname> sólo puede contener caracteres
52 alfanuméricos, guiones ("-"), barras bajas ("_"), o puntos ("."). No
53 hay ninguna restricción en el argumento <varname>$dirs</varname> . </para>
55 <para> El parámetro <varname>$dirs</varname> especifica en qué carpetas
56 buscar el archivo. Si el valor es <constant>NULL</constant> , sólo
57 se buscará en el <methodname>include_path</methodname> ; si el valor
58 es un string o un array, se buscará en la carpeta o carpetas
59 especificadas , seguidas del <methodname>include_path</methodname> . </para>
61 <para> El argumento <varname>$once</varname> es un booleano. Si es
62 <constant>TRUE</constant> ,
63 <methodname>Zend_Loader::loadFile()</methodname> esa la función
64 <acronym>PHP</acronym>
65 <ulink url="http://php.net/include">
66 <methodname>include_once()</methodname>
67 </ulink> para cargar el archivo, de lo contrario se utiliza la
68 función <acronym>PHP</acronym>
69 <ulink url="http://php.net/include_once">
70 <methodname>include()</methodname>
75 <sect2 id="zend.loader.load.class">
77 <title>Cargando Clases</title>
79 <para> El método estático <methodname>Zend_Loader::loadClass($class,
80 $dirs)</methodname> carga un archivo <acronym>PHP</acronym> y
81 comprueba la existencia de la clase. </para>
83 <example id="zend.loader.load.class.example">
84 <title>Ejemplo del método loadClass()</title>
85 <programlisting language="php"><![CDATA[
86 Zend_Loader::loadClass('Container_Tree',
88 '/home/production/mylib',
89 '/home/production/myapp'
95 <para> La cadena que especifica la clase es convertida a una ruta
96 relativa sustituyendo las barras bajas (_) por el separador de
97 carpeta de su Sistema Operativo, y añadiendo '.php'. En el ejemplo
98 de arriba, 'Container_Tree' se convierte en 'Container\\Tree.php' en
101 <para> Si <varname>$dirs</varname> es una cadena o un array,
102 <methodname>Zend_Loader::loadClass()</methodname> busca las
103 carpetas en el orden suministrado. El primer archivo encontrado es
104 cargado. Si el archivo no existe en el <varname>$dirs</varname>
105 especificado, entonces se busca en el
106 <methodname>include_path</methodname> del entorno
107 <acronym>PHP</acronym> . </para>
109 <para> Si el archivo no es encontrado o la clase no existe después de la
110 carga, <methodname>Zend_Loader::loadClass()</methodname> lanza una
111 <classname>Zend_Exception</classname> . </para>
114 <methodname>Zend_Loader::loadFile()</methodname> se usa para cargar,
115 así que el nombre de la clase puede contener únicamente caracteres
116 alfanuméricos, guiones ('-'), barras bajas ('_'), y puntos ('.'). </para>
119 <title>Loading Classes from PHP Namespaces</title>
122 Starting in version 1.10.0, Zend Framework now allows loading classes from PHP
123 namespaces. This support follows the same guidelines and implementation as that
125 url="http://groups.google.com/group/php-standards/web/psr-0-final-proposal">PHP
126 Framework Interop Group PSR-0</ulink> reference implementation.
130 Under this guideline, the following rules apply:
136 Each namespace separator is converted to a
137 <constant>DIRECTORY_SEPARATOR</constant> when loading from the file system.
143 Each "_" character in the <emphasis>CLASS NAME</emphasis> is converted to a
144 <constant>DIRECTORY_SEPARATOR</constant>. The "_" character has no special
145 meaning in the namespace.
151 The fully-qualified namespace and class is suffixed with ".php" when loading
152 from the file system.
164 <classname>\Doctrine\Common\IsolatedClassLoader</classname> =>
165 <filename>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php</filename>
171 <classname>\namespace\package\Class_Name</classname> =>
172 <filename>/path/to/project/lib/vendor/namespace/package/Class/Name.php</filename>
178 <classname>\namespace\package_name\Class_Name</classname> =>
179 <filename>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php</filename>
186 <sect2 id="zend.loader.load.isreadable">
188 <title>Comprobando si un Archivo Puede Ser Leído</title>
190 <para> El método estático
191 <methodname>Zend_Loader::isReadable($pathname)</methodname>
192 devuelve <constant>TRUE</constant> si el archivo en la ruta
193 $pathname existe y tiene permisos de lectura,
194 <constant>FALSE</constant> en caso contrario. </para>
196 <example id="zend.loader.load.isreadable.example">
197 <title>Ejemplo del método isReadable()</title>
198 <programlisting language="php"><![CDATA[
199 if (Zend_Loader::isReadable($filename)) {
200 // hace algo con $filename
205 <para> El argumento <varname>$filename</varname> especifica el nombre de
206 archivo que comprobar. Puede contener información de la ruta. Este
207 método envuelve la función <acronym>PHP</acronym>
208 <ulink url="http://php.net/is_readable">
209 <methodname>is_readable()</methodname>
210 </ulink> . La función <acronym>PHP</acronym> no busca en
211 <methodname>include_path</methodname> , mientras que
212 <methodname>Zend_Loader::isReadable()</methodname> sí. </para>
216 <sect2 id="zend.loader.load.autoload">
218 <title>Usando el Autoloader</title>
220 <para> La clase <classname>Zend_Loader</classname> contiene un método
221 que se puede registrar con <acronym>PHP</acronym> SPL autoloader.
222 <methodname>Zend_Loader::autoload()</methodname> es el método
223 callback. Por comodidad, <classname>Zend_Loader</classname> permite
224 a la función <methodname>registerAutoload()</methodname> registrar
225 su método <methodname>autoload()</methodname> . Si la extensión
226 <methodname>spl_autoload</methodname> no está presente en el
227 entorno <acronym>PHP</acronym> , entonces el método
228 <methodname>registerAutoload()</methodname> lanza una
229 <classname>Zend_Exception</classname> . </para>
231 <example id="zend.loader.load.autoload.example">
232 <title>Ejemplo de registro del método callback del
234 <programlisting language="php"><![CDATA[
235 Zend_Loader::registerAutoload();
239 <para> Después de registrar el callback de autoload de Zend Framework,
240 se pueden referenciar clases de Zend Framework sin tener que
241 cargarlas explícitamente. El método
242 <methodname>autoload()</methodname> usa automáticamente
243 <methodname>Zend_Loader::loadClass()</methodname> cuando
244 referencie una clase. </para>
246 <para> Si ha extendido la clase <classname>Zend_Loader</classname> , se
247 puede pasar un argumento opcional a
248 <methodname>registerAutoload()</methodname> , para especificar
249 la clase a partir de la cual registrar un método
250 <methodname>autoload()</methodname> . </para>
252 <example id="zend.loader.load.autoload.example-extended">
253 <title>Ejemplo de registro del método de callback autoload desde una
254 clase extendida</title>
255 <para> Debido a la semántica de referencia de funciones estáticas en
256 <acronym>PHP</acronym> , se debe implementar código tanto
257 para la clase <methodname>loadClass()</methodname> como
258 <methodname>autoload()</methodname> , y
259 <methodname>autoload()</methodname> debe llamar a
260 <methodname>self::loadClass()</methodname> . Si su método
261 <methodname>autoload()</methodname> delega en su padre la
262 llamada a <methodname>self::loadClass()</methodname> , entonces
263 llamará al método con ese nombre en la clase padre, no la
265 <programlisting language="php"><![CDATA[
266 class My_Loader extends Zend_Loader
268 public static function loadClass($class, $dirs = null)
270 parent::loadClass($class, $dirs);
273 public static function autoload($class)
276 self::loadClass($class);
278 } catch (Exception $e) {
284 Zend_Loader::registerAutoload('My_Loader');
288 <para> Se puede eliminar un callback de autoload.
289 <methodname>registerAutoload()</methodname> tiene un segundo
290 parámetro opcional, que es <constant>TRUE</constant> por defecto. Si
291 este parámetro es <constant>FALSE</constant> , el callback de
292 autoload será borrado de la pila de autoload SPL. </para>