2
0

Zend_Loader.xml 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.load">
  5. <title>Cargando archivos y clases dinámicamente</title>
  6. <para>
  7. La clase Zend_Loader incluye métodos para ayudar a cargar archivos
  8. dinámicamente.
  9. </para>
  10. <tip>
  11. <title>Zend_Loader vs. require_once()</title>
  12. <para>
  13. Los métodos de <classname>Zend_Loader</classname> tienen más utilidad si el
  14. nombre de archivo que necesita cargar es variable. Por ejemplo,
  15. si éste se basa en un parametro de entrada del usuario o argumento
  16. de un método. Si carga un archivo o clase cuyo nombre es constante, no
  17. hay ningún beneficio al usar <classname>Zend_Loader</classname> sobre el uso
  18. de funciones tradicionales de PHP como
  19. <ulink url="http://php.net/require_once"><methodname>require_once()</methodname></ulink>.
  20. </para>
  21. </tip>
  22. <sect2 id="zend.loader.load.file">
  23. <title>Cargando Archivos</title>
  24. <para>
  25. El método estático <classname>Zend_Loader::loadFile()</classname> carga un archivo
  26. PHP. El archivo cargado puede contener cualquier código PHP.
  27. El método se comporta como un envoltorio para la función PHP
  28. <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>.
  29. Este método devuelve un booleano false en caso de fallo, por ejemplo,
  30. si el archivo especificado no existe.
  31. </para>
  32. <example id="zend.loader.load.file.example">
  33. <title>Ejemplo del Método loadFile()</title>
  34. <programlisting language="php"><![CDATA[
  35. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  36. ]]></programlisting>
  37. </example>
  38. <para>
  39. El argumento <methodname>$filename</methodname> especifica el archivo que se va a cargar,
  40. el cual no debe contener ninguna información de rutas.
  41. Una verificación de seguridad es efectuada sobre <methodname>$filename</methodname>.
  42. El archivo <methodname>$filename</methodname> sólo puede contener caracteres alfanuméricos,
  43. guiones ("-"), barras bajas ("_"), o puntos (".").
  44. No hay ninguna restricción en el argumento <methodname>$dirs</methodname>.
  45. </para>
  46. <para>
  47. El parámetro <methodname>$dirs</methodname> especifica en qué carpetas buscar el archivo.
  48. Si el valor es <methodname>NULL</methodname>, sólo se buscará en el <methodname>include_path</methodname>
  49. ; si el valor es un string o un array, se buscará en la carpeta o carpetas especificadas
  50. , seguidas del <methodname>include_path</methodname>.
  51. </para>
  52. <para>
  53. El argumento <methodname>$once</methodname> es un booleano. Si es <methodname>TRUE</methodname>,
  54. <classname>Zend_Loader::loadFile()</classname> esa la función PHP
  55. <ulink url="http://php.net/include"><methodname>include_once()</methodname></ulink>
  56. para cargar el archivo, de lo contrario se utiliza la función PHP
  57. <ulink url="http://php.net/include_once"><methodname>include()</methodname></ulink>.
  58. </para>
  59. </sect2>
  60. <sect2 id="zend.loader.load.class">
  61. <title>Cargando Clases</title>
  62. <para>
  63. El método estático <methodname>Zend_Loader::loadClass($class, $dirs)</methodname>
  64. carga un archivo PHP y comprueba la existencia de la clase.
  65. </para>
  66. <example id="zend.loader.load.class.example">
  67. <title>Ejemplo del método loadClass()</title>
  68. <programlisting language="php"><![CDATA[
  69. Zend_Loader::loadClass('Container_Tree',
  70. array(
  71. '/home/production/mylib',
  72. '/home/production/myapp'
  73. )
  74. );
  75. ]]></programlisting>
  76. </example>
  77. <para>
  78. La cadena que especifica la clase es convertida a una ruta relativa sustituyendo las barras
  79. bajas (_) por el separador de carpeta de su Sistema Operativo, y añadiendo
  80. '.php'. En el ejemplo de arriba, 'Container_Tree' se convierte en 'Container\\Tree.php' en Windows.
  81. </para>
  82. <para>
  83. Si <methodname>$dirs</methodname> es una cadena o un array,
  84. <classname>Zend_Loader::loadClass()</classname> busca las carpetas en el
  85. orden suministrado. El primer archivo encontrado es cargado. Si el archivo
  86. no existe en el <methodname>$dirs</methodname> especificado, entonces se busca en el
  87. <methodname>include_path</methodname> del entorno PHP.
  88. </para>
  89. <para>
  90. Si el archivo no es encontrado o la clase no existe después de la carga,
  91. <methodname>Zend_Loader::loadClass()</methodname> lanza una <methodname>Zend_Exception</methodname>.
  92. </para>
  93. <para>
  94. <classname>Zend_Loader::loadFile()</classname> se usa para cargar, así que
  95. el nombre de la clase puede contener únicamente caracteres alfanuméricos,
  96. guiones ('-'), barras bajas ('_'), y puntos ('.').
  97. </para>
  98. </sect2>
  99. <sect2 id="zend.loader.load.isreadable">
  100. <title>Comprobando si un Archivo Puede Ser Leído</title>
  101. <para>
  102. El método estático <classname>Zend_Loader::isReadable($pathname)</classname>
  103. devuelve <methodname>TRUE</methodname> si el archivo en la ruta $pathname existe
  104. y tiene permisos de lectura, <methodname>FALSE</methodname> en caso contrario.
  105. </para>
  106. <example id="zend.loader.load.isreadable.example">
  107. <title>Ejemplo del método isReadable()</title>
  108. <programlisting language="php"><![CDATA[
  109. if (Zend_Loader::isReadable($filename)) {
  110. // hace algo con $filename
  111. }
  112. ]]></programlisting>
  113. </example>
  114. <para>
  115. El argumento <methodname>$filename</methodname> especifica el nombre de archivo que
  116. comprobar. Puede contener información de la ruta.
  117. Este método envuelve la función PHP
  118. <ulink url="http://php.net/is_readable"><methodname>is_readable()</methodname></ulink>.
  119. La función PHP no busca en <methodname>include_path</methodname>,
  120. mientras que <methodname>Zend_Loader::isReadable()</methodname> sí.
  121. </para>
  122. </sect2>
  123. <sect2 id="zend.loader.load.autoload">
  124. <title>Usando el Autoloader</title>
  125. <para>
  126. La clase <classname>Zend_Loader</classname> contiene un método que se puede registrar
  127. con PHP SPL autoloader. <methodname>Zend_Loader::autoload()</methodname> es el método
  128. callback. Por comodidad, <classname>Zend_Loader</classname> permite a la función
  129. <methodname>registerAutoload()</methodname> registrar su método
  130. <methodname>autoload()</methodname>. Si la extensión <methodname>spl_autoload</methodname>
  131. no está presente en el entorno PHP, entonces el método
  132. <methodname>registerAutoload()</methodname> lanza una <methodname>Zend_Exception</methodname>.
  133. </para>
  134. <example id="zend.loader.load.autoload.example">
  135. <title>Ejemplo de registro del método callback del autoloader</title>
  136. <programlisting language="php"><![CDATA[
  137. Zend_Loader::registerAutoload();
  138. ]]></programlisting>
  139. </example>
  140. <para>
  141. Después de registrar el callback de autoload de Zend Framework, se pueden
  142. referenciar clases de Zend Framework sin tener que cargarlas
  143. explícitamente. El método <methodname>autoload()</methodname> usa automáticamente
  144. <methodname>Zend_Loader::loadClass()</methodname> cuando referencie una clase.
  145. </para>
  146. <para>
  147. Si ha extendido la clase <classname>Zend_Loader</classname>, se puede pasar un
  148. argumento opcional a <methodname>registerAutoload()</methodname>, para especificar
  149. la clase a partir de la cual registrar un método <methodname>autoload()</methodname>.
  150. </para>
  151. <example id="zend.loader.load.autoload.example-extended">
  152. <title>Ejemplo de registro del método de callback autoload desde una clase
  153. extendida</title>
  154. <para>
  155. Debido a la semántica de referencia de funciones estáticas en PHP,
  156. se debe implementar código tanto para la clase <methodname>loadClass()</methodname>
  157. como <methodname>autoload()</methodname>, y <methodname>autoload()</methodname>
  158. debe llamar a <methodname>self::loadClass()</methodname>. Si su método
  159. <methodname>autoload()</methodname> delega en su padre la llamada a
  160. <methodname>self::loadClass()</methodname>, entonces llamará
  161. al método con ese nombre en la clase padre, no la subclase.
  162. </para>
  163. <programlisting language="php"><![CDATA[
  164. class My_Loader extends Zend_Loader
  165. {
  166. public static function loadClass($class, $dirs = null)
  167. {
  168. parent::loadClass($class, $dirs);
  169. }
  170. public static function autoload($class)
  171. {
  172. try {
  173. self::loadClass($class);
  174. return $class;
  175. } catch (Exception $e) {
  176. return false;
  177. }
  178. }
  179. }
  180. Zend_Loader::registerAutoload('My_Loader');
  181. ]]></programlisting>
  182. </example>
  183. <para>
  184. Se puede eliminar un callback de autoload.
  185. <methodname>registerAutoload()</methodname> tiene un segundo parámetro opcional,
  186. que es <methodname>true</methodname> por defecto. Si este parámetro es
  187. <methodname>false</methodname>, el callback de autoload será borrado de la pila
  188. de autoload SPL.
  189. </para>
  190. </sect2>
  191. </sect1>
  192. <!--
  193. vim:se ts=4 sw=4 et:
  194. -->