Zend_Loader.xml 9.1 KB

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