Zend_Loader.xml 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 12819 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.load">
  5. <title>Charger les fichiers et les classes dynamiquement</title>
  6. <para>La classe <classname>Zend_Loader</classname> inclut des méthodes afin de vous aider à charger des fichiers
  7. dynamiquement.</para>
  8. <tip>
  9. <title>Zend_Loader contre require_once()</title>
  10. <para>Les méthodes <classname>Zend_Loader</classname> sont les meilleures à utiliser si le nom de fichier que vous devez
  11. charger est variable. Par exemple, s'il est basé sur un paramètre de la saisie de l'utilisateur ou un argument
  12. de méthode. Si vous chargez un fichier ou une classe dont le nom est constant, il n'y a aucun avantage à
  13. l'utilisation de <classname>Zend_Loader</classname> sur l'utilisation de fonctions de PHP traditionnelles comme <ulink
  14. url="http://php.net/require_once"><code>require_once()</code></ulink>.</para>
  15. </tip>
  16. <sect2 id="zend.loader.load.file">
  17. <title>Charger des fichiers</title>
  18. <para>La méthode statique <classname>Zend_Loader::loadFile()</classname> charge un fichier PHP, qui peut contenir du code
  19. PHP arbitraire. Cette méthode enveloppe la fonction PHP <ulink
  20. url="http://php.net/include"><code>include()</code></ulink>, et retournera le booléen <code>false</code>
  21. si le fichier n'existe pas.</para>
  22. <example id="zend.loader.file.example">
  23. <title>Exemple d'utilisation de la méthode loadFile()</title>
  24. <programlisting role="php"><![CDATA[
  25. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  26. ]]></programlisting>
  27. </example>
  28. <para>L'argument <code>$filename</code> définit le nom du fichier à charger, et il ne doit contenir aucune
  29. information concernant son chemin d'accès. Une vérification de sécurité est effectuée sur
  30. <code>$filename</code>. Le fichier <code>$filename</code> ne peut contenir que des caractères alphanumérique,
  31. des tirets ("-"), des tirets-bas ("_") ou des points ("."). Aucune de ces restrictions ne s'applique à
  32. l'argument <code>$dirs</code>.</para>
  33. <para>L'argument <code>$dirs</code> définit les dossiers où rechercher le fichier. Si <code>NULL</code>, la
  34. recherche s'effectuera uniquement dans les dossiers définis par la variable <code>include_path</code>. Si c'est
  35. une chaîne ou un tableau, le ou les répertoires spécifiés seront scannés, ainsi que les dossiers définis par la
  36. variable <code>include_path</code>.</para>
  37. <para>L'argument <code>$once</code> est un booléen. Si <code>true</code>, <classname>Zend_Loader::loadFile()</classname>
  38. utilise la fonction PHP <ulink url="http://php.net/include"><code>include_once()</code></ulink> pour charger le
  39. fichier sinon la fonction PHP <ulink url="http://php.net/include"><code>include()</code></ulink> est
  40. utilisée.</para>
  41. </sect2>
  42. <sect2 id="zend.loader.load.class">
  43. <title>Charger des classes</title>
  44. <para>La méthode statique <classname>Zend_Loader::loadClass($class, $dirs)</classname> charge un fichier PHP et vérifie
  45. l'existence de la classe.</para>
  46. <example id="zend.loader.load.class.example">
  47. <title>Exemple d'utilisation de la méthode loadClass()</title>
  48. <programlisting role="php"><![CDATA[
  49. Zend_Loader::loadClass('Container_Tree',
  50. array(
  51. '/home/production/mylib',
  52. '/home/production/myapp'
  53. )
  54. );
  55. ]]></programlisting>
  56. </example>
  57. <para>La chaîne spécifiant la classe est convertie en chemin relatif en remplaçant les tirets bas ("_") par le
  58. séparateur de dossier puis en ajoutant le bloc ".php". Dans l'exemple ci-dessus, "Container_Tree" devient
  59. "Container/Tree.php".</para>
  60. <para>Si <code>$dirs</code> est une chaîne ou un tableau, <classname>Zend_Loader::loadClass()</classname> va chercher dans
  61. les dossiers suivant l'ordre donné. Le premier fichier trouvé est chargé. Si le fichier n'existe pas dans les
  62. dossiers spécifiés <code>$dirs</code>, alors la recherche est effectuée dans <code>include_path</code> du
  63. PHP.</para>
  64. <para>Si le fichier n'est pas trouvé ou que la classe n'existe pas après le chargement,
  65. <classname>Zend_Loader::loadClass()</classname> lèvera une exception <classname>Zend_Exception</classname></para>
  66. <para><classname>Zend_Loader::loadFile()</classname> est utilisé pour le chargement, donc le nom de la classe ne peut
  67. contenir que des caractères alphanumériques et les caractères tiret ("-"), tiret bas ("_"), et point
  68. (".").</para>
  69. </sect2>
  70. <sect2 id="zend.loader.load.isreadable">
  71. <title>Tester si un fichier est lisible</title>
  72. <para>La méthode statique <classname>Zend_Loader::isReadable($pathname)</classname> retourne <code>true</code> si le
  73. fichier existe dans le dossier spécifié et qu'il est lisible, sinon <code>false</code>.</para>
  74. <example id="zend.loader.load.isreadable.example">
  75. <title>Exemple d'utilisation de la méthode isReadable()</title>
  76. <programlisting role="php"><![CDATA[
  77. if (Zend_Loader::isReadable($filename)) {
  78. // puis manipulation avec $filename
  79. }
  80. ]]></programlisting>
  81. </example>
  82. <para>L'argument <code>$filename</code> spécifie le nom du fichier à vérifier. Il peut contenir des informations
  83. concernant le chemin d'accès. Cette méthode enveloppe la fonction PHP <ulink
  84. url="http://php.net/is_readable"><code>is_readable()</code></ulink>. La fonction PHP ne recherche pas le fichier
  85. spécifié dans les répertoires de l'<code>include_path</code>, contrairement à
  86. <classname>Zend_Loader::isReadable()</classname>.</para>
  87. </sect2>
  88. <sect2 id="zend.loader.load.autoload">
  89. <title>Utiliser l'autoloader</title>
  90. <para>La classe Zend_Loader contient une méthode <classname>Zend_Loader::autoload()</classname> que vous pouvez inscrire
  91. dans le PHP SPL autoloader. Par commodité, <classname>Zend_Loader</classname> fournit la fonction
  92. <code>registerAutoload()</code> qui enregistre automatiquement sa méthode <code>autoload()</code>. Si
  93. l'extension <code>spl_autoload</code> n'est pas présente dans l'environnement PHP, alors la méthode
  94. <code>registerAutoload()</code> lèvera une <classname>Zend_Exception</classname>.</para>
  95. <example id="zend.loader.load.autoload.example">
  96. <title>Exemple d'inscription de la méthode de callback autoloader</title>
  97. <programlisting role="php"><![CDATA[
  98. Zend_Loader::registerAutoload();
  99. ]]></programlisting>
  100. </example>
  101. <para>Après avoir inscrit le callback vers l'autoload de Zend Framework, vous pouvez appeler une classe de Zend
  102. Framework sans l'avoir explicitement chargé auparavant. La méthode autoload utilise automatiquement
  103. <classname>Zend_Loader::loadClass()</classname> quand vous appelez une classe.</para>
  104. <para>Si vous avez étendu la classe <classname>Zend_Loader</classname>, vous pouvez passer un argument optionnel à
  105. <code>registerAutoload()</code>, pour spécifier la classe de laquelle vous souhaitez enregistrer la méthode
  106. <code>autoload()</code>.</para>
  107. <example id="zend.loader.load.autoload.example-extended">
  108. <title>Exemple d'inscription de la méthode de callback autoloader d'une classe étendue</title>
  109. <para>A cause de la sémantique de référencement des fonctions statiques en PHP, vous devez implémenter le
  110. code pour les méthodes <code>loadClass()</code> et <code>autoload()</code>, et la méthode
  111. <code>autoload()</code> doit appeler <code>self::loadClass()</code>. Si votre méthode
  112. <code>autoload()</code> délégue à son parent l'appel <code>self::loadClass()</code>, alors cela appellerait
  113. la méthode de même nom dans la classe parente et non dans la sous-classe.</para>
  114. <programlisting role="php"><![CDATA[
  115. class Mon_Chargeur extends Zend_Loader
  116. {
  117. public static function loadClass($class, $dirs = null)
  118. {
  119. parent::loadClass($class, $dirs);
  120. }
  121. public static function autoload($class)
  122. {
  123. try {
  124. self::loadClass($class);
  125. return $class;
  126. } catch (Exception $e) {
  127. return false;
  128. }
  129. }}
  130. Zend_Loader::registerAutoload('Mon_Chargeur');
  131. ]]></programlisting>
  132. </example>
  133. <para>Vous pouvez effacer un callback d'autoload. <code>registerAutoload()</code> a un paramètre optionnel, qui
  134. est réglé à <code>true</code> par défaut. S'il vaut <code>false</code>, le callback de l'autoload est alors
  135. effacé de la pile des autoload SPL.</para>
  136. </sect2>
  137. </sect1>