Zend_Loader.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20243 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.load">
  5. <title>Cargando archivos y clases dinámicamente</title>
  6. <para> La clase <classname>Zend_Loader</classname> incluye métodos para
  7. ayudar a cargar archivos dinámicamente. </para>
  8. <tip>
  9. <title>Zend_Loader vs. require_once()</title>
  10. <para> Los métodos de <classname>Zend_Loader</classname> tienen más
  11. utilidad si el nombre de archivo que necesita cargar es variable.
  12. Por ejemplo, si éste se basa en un parametro de entrada del usuario
  13. o argumento de un método. Si carga un archivo o clase cuyo nombre es
  14. constante, no hay ningún beneficio al usar
  15. <classname>Zend_Loader</classname> sobre el uso de funciones
  16. tradicionales de <acronym>PHP</acronym> como <ulink
  17. url="http://php.net/require_once">
  18. <methodname>require_once()</methodname>
  19. </ulink> . </para>
  20. </tip>
  21. <sect2 id="zend.loader.load.file">
  22. <title>Cargando Archivos</title>
  23. <para> El método estático
  24. <methodname>Zend_Loader::loadFile()</methodname> carga un
  25. archivo <acronym>PHP</acronym> . El archivo cargado puede contener
  26. cualquier código <acronym>PHP</acronym> . El método se comporta como
  27. un envoltorio para la función <acronym>PHP</acronym>
  28. <ulink url="http://php.net/include">
  29. <methodname>include()</methodname>
  30. </ulink> . Este método devuelve un booleano
  31. <constant>FALSE</constant> en caso de fallo, por ejemplo, si el
  32. archivo especificado no existe. </para>
  33. <example id="zend.loader.load.file.example">
  34. <title>Ejemplo del Método loadFile()</title>
  35. <programlisting language="php"><![CDATA[
  36. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  37. ]]></programlisting>
  38. </example>
  39. <para> El argumento <varname>$filename</varname> especifica el archivo
  40. que se va a cargar, el cual no debe contener ninguna información de
  41. rutas. Una verificación de seguridad es efectuada sobre
  42. <varname>$filename</varname> . El archivo
  43. <varname>$filename</varname> sólo puede contener caracteres
  44. alfanuméricos, guiones ("-"), barras bajas ("_"), o puntos ("."). No
  45. hay ninguna restricción en el argumento <varname>$dirs</varname> . </para>
  46. <para> El parámetro <varname>$dirs</varname> especifica en qué carpetas
  47. buscar el archivo. Si el valor es <constant>NULL</constant> , sólo
  48. se buscará en el <methodname>include_path</methodname> ; si el valor
  49. es un string o un array, se buscará en la carpeta o carpetas
  50. especificadas , seguidas del <methodname>include_path</methodname> . </para>
  51. <para> El argumento <varname>$once</varname> es un booleano. Si es
  52. <constant>TRUE</constant> ,
  53. <methodname>Zend_Loader::loadFile()</methodname> esa la función
  54. <acronym>PHP</acronym>
  55. <ulink url="http://php.net/include">
  56. <methodname>include_once()</methodname>
  57. </ulink> para cargar el archivo, de lo contrario se utiliza la
  58. función <acronym>PHP</acronym>
  59. <ulink url="http://php.net/include_once">
  60. <methodname>include()</methodname>
  61. </ulink> . </para>
  62. </sect2>
  63. <sect2 id="zend.loader.load.class">
  64. <title>Cargando Clases</title>
  65. <para> El método estático <methodname>Zend_Loader::loadClass($class,
  66. $dirs)</methodname> carga un archivo <acronym>PHP</acronym> y
  67. comprueba la existencia de la clase. </para>
  68. <example id="zend.loader.load.class.example">
  69. <title>Ejemplo del método loadClass()</title>
  70. <programlisting language="php"><![CDATA[
  71. Zend_Loader::loadClass('Container_Tree',
  72. array(
  73. '/home/production/mylib',
  74. '/home/production/myapp'
  75. )
  76. );
  77. ]]></programlisting>
  78. </example>
  79. <para> La cadena que especifica la clase es convertida a una ruta
  80. relativa sustituyendo las barras bajas (_) por el separador de
  81. carpeta de su Sistema Operativo, y añadiendo '.php'. En el ejemplo
  82. de arriba, 'Container_Tree' se convierte en 'Container\\Tree.php' en
  83. Windows. </para>
  84. <para> Si <varname>$dirs</varname> es una cadena o un array,
  85. <methodname>Zend_Loader::loadClass()</methodname> busca las
  86. carpetas en el orden suministrado. El primer archivo encontrado es
  87. cargado. Si el archivo no existe en el <varname>$dirs</varname>
  88. especificado, entonces se busca en el
  89. <methodname>include_path</methodname> del entorno
  90. <acronym>PHP</acronym> . </para>
  91. <para> Si el archivo no es encontrado o la clase no existe después de la
  92. carga, <methodname>Zend_Loader::loadClass()</methodname> lanza una
  93. <classname>Zend_Exception</classname> . </para>
  94. <para>
  95. <methodname>Zend_Loader::loadFile()</methodname> se usa para cargar,
  96. así que el nombre de la clase puede contener únicamente caracteres
  97. alfanuméricos, guiones ('-'), barras bajas ('_'), y puntos ('.'). </para>
  98. <note>
  99. <title>Loading Classes from PHP Namespaces</title>
  100. <para>
  101. Starting in version 1.10.0, Zend Framework now allows loading classes from PHP
  102. namespaces. This support follows the same guidelines and implementation as that
  103. found in the <ulink
  104. url="http://groups.google.com/group/php-standards/web/psr-0-final-proposal">PHP
  105. Framework Interop Group PSR-0</ulink> reference implementation.
  106. </para>
  107. <para>
  108. Under this guideline, the following rules apply:
  109. </para>
  110. <itemizedlist>
  111. <listitem>
  112. <para>
  113. Each namespace separator is converted to a
  114. <constant>DIRECTORY_SEPARATOR</constant> when loading from the file system.
  115. </para>
  116. </listitem>
  117. <listitem>
  118. <para>
  119. Each "_" character in the <emphasis>CLASS NAME</emphasis> is converted to a
  120. <constant>DIRECTORY_SEPARATOR</constant>. The "_" character has no special
  121. meaning in the namespace.
  122. </para>
  123. </listitem>
  124. <listitem>
  125. <para>
  126. The fully-qualified namespace and class is suffixed with ".php" when loading
  127. from the file system.
  128. </para>
  129. </listitem>
  130. </itemizedlist>
  131. <para>
  132. As examples:
  133. </para>
  134. <itemizedlist>
  135. <listitem>
  136. <para>
  137. <classname>\Doctrine\Common\IsolatedClassLoader</classname> =&gt;
  138. <filename>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php</filename>
  139. </para>
  140. </listitem>
  141. <listitem>
  142. <para>
  143. <classname>\namespace\package\Class_Name</classname> =&gt;
  144. <filename>/path/to/project/lib/vendor/namespace/package/Class/Name.php</filename>
  145. </para>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. <classname>\namespace\package_name\Class_Name</classname> =&gt;
  150. <filename>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php</filename>
  151. </para>
  152. </listitem>
  153. </itemizedlist>
  154. </note>
  155. </sect2>
  156. <sect2 id="zend.loader.load.isreadable">
  157. <title>Comprobando si un Archivo Puede Ser Leído</title>
  158. <para> El método estático
  159. <methodname>Zend_Loader::isReadable($pathname)</methodname>
  160. devuelve <constant>TRUE</constant> si el archivo en la ruta
  161. $pathname existe y tiene permisos de lectura,
  162. <constant>FALSE</constant> en caso contrario. </para>
  163. <example id="zend.loader.load.isreadable.example">
  164. <title>Ejemplo del método isReadable()</title>
  165. <programlisting language="php"><![CDATA[
  166. if (Zend_Loader::isReadable($filename)) {
  167. // hace algo con $filename
  168. }
  169. ]]></programlisting>
  170. </example>
  171. <para> El argumento <varname>$filename</varname> especifica el nombre de
  172. archivo que comprobar. Puede contener información de la ruta. Este
  173. método envuelve la función <acronym>PHP</acronym>
  174. <ulink url="http://php.net/is_readable">
  175. <methodname>is_readable()</methodname>
  176. </ulink> . La función <acronym>PHP</acronym> no busca en
  177. <methodname>include_path</methodname> , mientras que
  178. <methodname>Zend_Loader::isReadable()</methodname> sí. </para>
  179. </sect2>
  180. <sect2 id="zend.loader.load.autoload">
  181. <title>Usando el Autoloader</title>
  182. <para> La clase <classname>Zend_Loader</classname> contiene un método
  183. que se puede registrar con <acronym>PHP</acronym> SPL autoloader.
  184. <methodname>Zend_Loader::autoload()</methodname> es el método
  185. callback. Por comodidad, <classname>Zend_Loader</classname> permite
  186. a la función <methodname>registerAutoload()</methodname> registrar
  187. su método <methodname>autoload()</methodname> . Si la extensión
  188. <methodname>spl_autoload</methodname> no está presente en el
  189. entorno <acronym>PHP</acronym> , entonces el método
  190. <methodname>registerAutoload()</methodname> lanza una
  191. <classname>Zend_Exception</classname> . </para>
  192. <example id="zend.loader.load.autoload.example">
  193. <title>Ejemplo de registro del método callback del
  194. autoloader</title>
  195. <programlisting language="php"><![CDATA[
  196. Zend_Loader::registerAutoload();
  197. ]]></programlisting>
  198. </example>
  199. <para> Después de registrar el callback de autoload de Zend Framework,
  200. se pueden referenciar clases de Zend Framework sin tener que
  201. cargarlas explícitamente. El método
  202. <methodname>autoload()</methodname> usa automáticamente
  203. <methodname>Zend_Loader::loadClass()</methodname> cuando
  204. referencie una clase. </para>
  205. <para> Si ha extendido la clase <classname>Zend_Loader</classname> , se
  206. puede pasar un argumento opcional a
  207. <methodname>registerAutoload()</methodname> , para especificar
  208. la clase a partir de la cual registrar un método
  209. <methodname>autoload()</methodname> . </para>
  210. <example id="zend.loader.load.autoload.example-extended">
  211. <title>Ejemplo de registro del método de callback autoload desde una
  212. clase extendida</title>
  213. <para> Debido a la semántica de referencia de funciones estáticas en
  214. <acronym>PHP</acronym> , se debe implementar código tanto
  215. para la clase <methodname>loadClass()</methodname> como
  216. <methodname>autoload()</methodname> , y
  217. <methodname>autoload()</methodname> debe llamar a
  218. <methodname>self::loadClass()</methodname> . Si su método
  219. <methodname>autoload()</methodname> delega en su padre la
  220. llamada a <methodname>self::loadClass()</methodname> , entonces
  221. llamará al método con ese nombre en la clase padre, no la
  222. subclase. </para>
  223. <programlisting language="php"><![CDATA[
  224. class My_Loader extends Zend_Loader
  225. {
  226. public static function loadClass($class, $dirs = null)
  227. {
  228. parent::loadClass($class, $dirs);
  229. }
  230. public static function autoload($class)
  231. {
  232. try {
  233. self::loadClass($class);
  234. return $class;
  235. } catch (Exception $e) {
  236. return false;
  237. }
  238. }
  239. }
  240. Zend_Loader::registerAutoload('My_Loader');
  241. ]]></programlisting>
  242. </example>
  243. <para> Se puede eliminar un callback de autoload.
  244. <methodname>registerAutoload()</methodname> tiene un segundo
  245. parámetro opcional, que es <constant>TRUE</constant> por defecto. Si
  246. este parámetro es <constant>FALSE</constant> , el callback de
  247. autoload será borrado de la pila de autoload SPL. </para>
  248. </sect2>
  249. </sect1>