Zend_Loader.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.load">
  5. <title>Charger les fichiers et les classes dynamiquement</title>
  6. <para>
  7. La classe <classname>Zend_Loader</classname> inclut des méthodes afin de vous aider à
  8. charger des fichiers dynamiquement.
  9. </para>
  10. <tip>
  11. <title>Zend_Loader contre require_once()</title>
  12. <para>
  13. Les méthodes <classname>Zend_Loader</classname> sont les meilleures à utiliser si
  14. le nom de fichier que vous devez charger est variable. Par exemple, s'il est basé sur un
  15. paramètre de la saisie de l'utilisateur ou un argument de méthode. Si vous chargez un
  16. fichier ou une classe dont le nom est constant, il n'y a aucun avantage à l'utilisation
  17. de <classname>Zend_Loader</classname> sur l'utilisation de fonctions de <acronym>PHP</acronym>
  18. traditionnelles comme <ulink
  19. url="http://php.net/require_once"><methodname>require_once()</methodname></ulink>.
  20. </para>
  21. </tip>
  22. <sect2 id="zend.loader.load.file">
  23. <title>Charger des fichiers</title>
  24. <para>
  25. La méthode statique <methodname>Zend_Loader::loadFile()</methodname> charge un
  26. fichier <acronym>PHP</acronym>, qui peut contenir du code <acronym>PHP</acronym> arbitraire. Cette méthode enveloppe la
  27. fonction <acronym>PHP</acronym> <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>, et
  28. retournera le booléen <constant>FALSE</constant> si le fichier n'existe pas.
  29. </para>
  30. <example id="zend.loader.file.example">
  31. <title>Exemple d'utilisation de la méthode loadFile()</title>
  32. <programlisting language="php"><![CDATA[
  33. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  34. ]]></programlisting>
  35. </example>
  36. <para>
  37. L'argument <varname>$filename</varname> définit le nom du fichier à charger, et il ne
  38. doit contenir aucune information concernant son chemin d'accès. Une vérification de
  39. sécurité est effectuée sur <varname>$filename</varname>. Le fichier <varname>$filename</varname> ne
  40. peut contenir que des caractères alphanumérique, des tirets ("-"), des tirets-bas ("_")
  41. ou des points ("."). Aucune de ces restrictions ne s'applique à l'argument
  42. <varname>$dirs</varname>.
  43. </para>
  44. <para>
  45. L'argument <varname>$dirs</varname> définit les dossiers où rechercher le fichier. Si
  46. <constant>NULL</constant>, la recherche s'effectuera uniquement dans les dossiers définis par la
  47. variable <code>include_path</code>. Si c'est une chaîne ou un tableau, le ou les
  48. répertoires spécifiés seront scannés, ainsi que les dossiers définis par la variable
  49. <code>include_path</code>.
  50. </para>
  51. <para>
  52. L'argument <varname>$once</varname> est un booléen. Si <constant>TRUE</constant>,
  53. <methodname>Zend_Loader::loadFile()</methodname> utilise la fonction <acronym>PHP</acronym> <ulink
  54. url="http://php.net/include"><methodname>include_once()</methodname></ulink> pour charger le fichier
  55. sinon la fonction <acronym>PHP</acronym> <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>
  56. est utilisée.
  57. </para>
  58. </sect2>
  59. <sect2 id="zend.loader.load.class">
  60. <title>Charger des classes</title>
  61. <para>
  62. La méthode statique <methodname>Zend_Loader::loadClass($class, $dirs)</methodname>
  63. charge un fichier <acronym>PHP</acronym> et vérifie l'existence de la classe.
  64. </para>
  65. <example id="zend.loader.load.class.example">
  66. <title>Exemple d'utilisation de la méthode loadClass()</title>
  67. <programlisting language="php"><![CDATA[
  68. Zend_Loader::loadClass('Container_Tree',
  69. array(
  70. '/home/production/mylib',
  71. '/home/production/myapp'
  72. )
  73. );
  74. ]]></programlisting>
  75. </example>
  76. <para>
  77. La chaîne spécifiant la classe est convertie en chemin relatif en remplaçant les
  78. tirets bas ("_") par le séparateur de dossier puis en ajoutant le bloc ".php". Dans
  79. l'exemple ci-dessus, "Container_Tree" devient "Container\\Tree.php".
  80. </para>
  81. <para>
  82. Si <varname>$dirs</varname> est une chaîne ou un tableau,
  83. <methodname>Zend_Loader::loadClass()</methodname> va chercher dans les dossiers suivant
  84. l'ordre donné. Le premier fichier trouvé est chargé. Si le fichier n'existe pas dans les
  85. dossiers spécifiés <varname>$dirs</varname>, alors la recherche est effectuée dans
  86. <code>include_path</code> du <acronym>PHP</acronym>.
  87. </para>
  88. <para>
  89. Si le fichier n'est pas trouvé ou que la classe n'existe pas après le chargement,
  90. <methodname>Zend_Loader::loadClass()</methodname> lèvera une exception
  91. <classname>Zend_Exception</classname>
  92. </para>
  93. <para>
  94. <methodname>Zend_Loader::loadFile()</methodname> est utilisé pour le chargement,
  95. donc le nom de la classe ne peut contenir que des caractères alphanumériques et les
  96. caractères tiret ("-"), tiret bas ("_"), et point (".").
  97. </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>Tester si un fichier est lisible</title>
  158. <para>
  159. La méthode statique <methodname>Zend_Loader::isReadable($pathname)</methodname>
  160. retourne <constant>TRUE</constant> si le fichier existe dans le dossier spécifié et qu'il est
  161. lisible, sinon <constant>FALSE</constant>.
  162. </para>
  163. <example id="zend.loader.load.isreadable.example">
  164. <title>Exemple d'utilisation de la méthode isReadable()</title>
  165. <programlisting language="php"><![CDATA[
  166. if (Zend_Loader::isReadable($filename)) {
  167. // puis manipulation avec $filename
  168. }
  169. ]]></programlisting>
  170. </example>
  171. <para>
  172. L'argument <varname>$filename</varname> spécifie le nom du fichier à vérifier. Il peut
  173. contenir des informations concernant le chemin d'accès. Cette méthode enveloppe la
  174. fonction <acronym>PHP</acronym> <ulink url="http://php.net/is_readable"><methodname>is_readable()</methodname></ulink>.
  175. La fonction <acronym>PHP</acronym> ne recherche pas le fichier spécifié dans les répertoires de
  176. l'<code>include_path</code>, contrairement à
  177. <methodname>Zend_Loader::isReadable()</methodname>.
  178. </para>
  179. </sect2>
  180. <sect2 id="zend.loader.load.autoload">
  181. <title>Utiliser l'autoloader</title>
  182. <para>
  183. La classe Zend_Loader contient une méthode
  184. <methodname>Zend_Loader::autoload()</methodname> que vous pouvez inscrire dans le <acronym>PHP</acronym> SPL
  185. autoloader. Par commodité, <classname>Zend_Loader</classname> fournit la fonction
  186. <methodname>registerAutoload()</methodname> qui enregistre automatiquement sa méthode
  187. <methodname>autoload()</methodname>. Si l'extension <code>spl_autoload</code> n'est pas présente
  188. dans l'environnement <acronym>PHP</acronym>, alors la méthode <methodname>registerAutoload()</methodname> lèvera une
  189. <classname>Zend_Exception</classname>.
  190. </para>
  191. <example id="zend.loader.load.autoload.example">
  192. <title>Exemple d'inscription de la méthode de callback autoloader</title>
  193. <programlisting language="php"><![CDATA[
  194. Zend_Loader::registerAutoload();
  195. ]]></programlisting>
  196. </example>
  197. <para>
  198. Après avoir inscrit le callback vers l'autoload de Zend Framework, vous pouvez
  199. appeler une classe de Zend Framework sans l'avoir explicitement chargé auparavant. La
  200. méthode autoload utilise automatiquement <methodname>Zend_Loader::loadClass()</methodname>
  201. quand vous appelez une classe.
  202. </para>
  203. <para>
  204. Si vous avez étendu la classe <classname>Zend_Loader</classname>, vous pouvez
  205. passer un argument optionnel à <methodname>registerAutoload()</methodname>, pour spécifier la classe
  206. de laquelle vous souhaitez enregistrer la méthode <methodname>autoload()</methodname>.
  207. </para>
  208. <example id="zend.loader.load.autoload.example-extended">
  209. <title>Exemple d'inscription de la méthode de callback autoloader d'une classe
  210. étendue</title>
  211. <para>
  212. A cause de la sémantique de référencement des fonctions statiques en <acronym>PHP</acronym>, vous
  213. devez implémenter le code pour les méthodes <methodname>loadClass()</methodname> et
  214. <methodname>autoload()</methodname>, et la méthode <methodname>autoload()</methodname> doit appeler
  215. <methodname>self::loadClass()</methodname>. Si votre méthode <methodname>autoload()</methodname> délégue à
  216. son parent l'appel <methodname>self::loadClass()</methodname>, alors cela appellerait la méthode
  217. de même nom dans la classe parente et non dans la sous-classe.
  218. </para>
  219. <programlisting language="php"><![CDATA[
  220. class Mon_Chargeur extends Zend_Loader
  221. {
  222. public static function loadClass($class, $dirs = null)
  223. {
  224. parent::loadClass($class, $dirs);
  225. }
  226. public static function autoload($class)
  227. {
  228. try {
  229. self::loadClass($class);
  230. return $class;
  231. } catch (Exception $e) {
  232. return false;
  233. }
  234. }}
  235. Zend_Loader::registerAutoload('Mon_Chargeur');
  236. ]]></programlisting>
  237. </example>
  238. <para>
  239. Vous pouvez effacer un callback d'autoload. <methodname>registerAutoload()</methodname> a un
  240. paramètre optionnel, qui est réglé à <constant>TRUE</constant> par défaut. S'il vaut
  241. <constant>FALSE</constant>, le callback de l'autoload est alors effacé de la pile des autoload
  242. SPL.
  243. </para>
  244. </sect2>
  245. </sect1>