1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21818 -->
4 <sect1 id="zend.loader.load">
5 <title>Charger les fichiers et les classes dynamiquement</title>
8 La classe <classname>Zend_Loader</classname> inclut des méthodes afin de vous aider à
9 charger des fichiers dynamiquement.
13 <title>Zend_Loader contre require_once()</title>
16 Les méthodes <classname>Zend_Loader</classname> sont les meilleures à utiliser si
17 le nom de fichier que vous devez charger est variable. Par exemple, s'il est basé sur un
18 paramètre de la saisie de l'utilisateur ou un argument de méthode. Si vous chargez un
19 fichier ou une classe dont le nom est constant, il n'y a aucun avantage à l'utilisation
20 de <classname>Zend_Loader</classname> sur l'utilisation de fonctions de <acronym>PHP</acronym>
21 traditionnelles comme <ulink
22 url="http://php.net/require_once"><methodname>require_once()</methodname></ulink>.
26 <sect2 id="zend.loader.load.file">
27 <title>Charger des fichiers</title>
30 La méthode statique <methodname>Zend_Loader::loadFile()</methodname> charge un
31 fichier <acronym>PHP</acronym>, qui peut contenir du code <acronym>PHP</acronym> arbitraire. Cette méthode enveloppe la
32 fonction <acronym>PHP</acronym> <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>, et
33 retournera le booléen <constant>FALSE</constant> si le fichier n'existe pas.
36 <example id="zend.loader.file.example">
37 <title>Exemple d'utilisation de la méthode loadFile()</title>
39 <programlisting language="php"><![CDATA[
40 Zend_Loader::loadFile($filename, $dirs=null, $once=false);
45 L'argument <varname>$filename</varname> définit le nom du fichier à charger, et il ne
46 doit contenir aucune information concernant son chemin d'accès. Une vérification de
47 sécurité est effectuée sur <varname>$filename</varname>. Le fichier <varname>$filename</varname> ne
48 peut contenir que des caractères alphanumérique, des tirets ("-"), des tirets-bas ("_")
49 ou des points ("."). Aucune de ces restrictions ne s'applique à l'argument
50 <varname>$dirs</varname>.
54 L'argument <varname>$dirs</varname> définit les dossiers où rechercher le fichier. Si
55 <constant>NULL</constant>, la recherche s'effectuera uniquement dans les dossiers définis par la
56 variable <code>include_path</code>. Si c'est une chaîne ou un tableau, le ou les
57 répertoires spécifiés seront scannés, ainsi que les dossiers définis par la variable
58 <code>include_path</code>.
62 L'argument <varname>$once</varname> est un booléen. Si <constant>TRUE</constant>,
63 <methodname>Zend_Loader::loadFile()</methodname> utilise la fonction <acronym>PHP</acronym> <ulink
64 url="http://php.net/include"><methodname>include_once()</methodname></ulink> pour charger le fichier
65 sinon la fonction <acronym>PHP</acronym> <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>
70 <sect2 id="zend.loader.load.class">
71 <title>Charger des classes</title>
74 La méthode statique <methodname>Zend_Loader::loadClass($class, $dirs)</methodname>
75 charge un fichier <acronym>PHP</acronym> et vérifie l'existence de la classe.
78 <example id="zend.loader.load.class.example">
79 <title>Exemple d'utilisation de la méthode loadClass()</title>
81 <programlisting language="php"><![CDATA[
82 Zend_Loader::loadClass('Container_Tree',
84 '/home/production/mylib',
85 '/home/production/myapp'
92 La chaîne spécifiant la classe est convertie en chemin relatif en remplaçant les
93 tirets bas ("_") par le séparateur de dossier puis en ajoutant le bloc ".php". Dans
94 l'exemple ci-dessus, "Container_Tree" devient "Container\\Tree.php".
98 Si <varname>$dirs</varname> est une chaîne ou un tableau,
99 <methodname>Zend_Loader::loadClass()</methodname> va chercher dans les dossiers suivant
100 l'ordre donné. Le premier fichier trouvé est chargé. Si le fichier n'existe pas dans les
101 dossiers spécifiés <varname>$dirs</varname>, alors la recherche est effectuée dans
102 <code>include_path</code> du <acronym>PHP</acronym>.
106 Si le fichier n'est pas trouvé ou que la classe n'existe pas après le chargement,
107 <methodname>Zend_Loader::loadClass()</methodname> lèvera une exception
108 <classname>Zend_Exception</classname>
112 <methodname>Zend_Loader::loadFile()</methodname> est utilisé pour le chargement,
113 donc le nom de la classe ne peut contenir que des caractères alphanumériques et les
114 caractères tiret ("-"), tiret bas ("_"), et point (".").
117 <title>Loading Classes from PHP Namespaces</title>
120 Starting in version 1.10.0, Zend Framework now allows loading classes from PHP
121 namespaces. This support follows the same guidelines and implementation as that
123 url="http://groups.google.com/group/php-standards/web/psr-0-final-proposal">PHP
124 Framework Interop Group PSR-0</ulink> reference implementation.
128 Under this guideline, the following rules apply:
134 Each namespace separator is converted to a
135 <constant>DIRECTORY_SEPARATOR</constant> when loading from the file system.
141 Each "_" character in the <emphasis>CLASS NAME</emphasis> is converted to a
142 <constant>DIRECTORY_SEPARATOR</constant>. The "_" character has no special
143 meaning in the namespace.
149 The fully-qualified namespace and class is suffixed with ".php" when loading
150 from the file system.
162 <classname>\Doctrine\Common\IsolatedClassLoader</classname> =>
163 <filename>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php</filename>
169 <classname>\namespace\package\Class_Name</classname> =>
170 <filename>/path/to/project/lib/vendor/namespace/package/Class/Name.php</filename>
176 <classname>\namespace\package_name\Class_Name</classname> =>
177 <filename>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php</filename>
184 <sect2 id="zend.loader.load.isreadable">
185 <title>Tester si un fichier est lisible</title>
188 La méthode statique <methodname>Zend_Loader::isReadable($pathname)</methodname>
189 retourne <constant>TRUE</constant> si le fichier existe dans le dossier spécifié et qu'il est
190 lisible, sinon <constant>FALSE</constant>.
193 <example id="zend.loader.load.isreadable.example">
194 <title>Exemple d'utilisation de la méthode isReadable()</title>
196 <programlisting language="php"><![CDATA[
197 if (Zend_Loader::isReadable($filename)) {
198 // puis manipulation avec $filename
204 L'argument <varname>$filename</varname> spécifie le nom du fichier à vérifier. Il peut
205 contenir des informations concernant le chemin d'accès. Cette méthode enveloppe la
206 fonction <acronym>PHP</acronym> <ulink url="http://php.net/is_readable"><methodname>is_readable()</methodname></ulink>.
207 La fonction <acronym>PHP</acronym> ne recherche pas le fichier spécifié dans les répertoires de
208 l'<code>include_path</code>, contrairement à
209 <methodname>Zend_Loader::isReadable()</methodname>.
213 <sect2 id="zend.loader.load.autoload">
214 <title>Utiliser l'autoloader</title>
217 La classe Zend_Loader contient une méthode
218 <methodname>Zend_Loader::autoload()</methodname> que vous pouvez inscrire dans le <acronym>PHP</acronym> SPL
219 autoloader. Par commodité, <classname>Zend_Loader</classname> fournit la fonction
220 <methodname>registerAutoload()</methodname> qui enregistre automatiquement sa méthode
221 <methodname>autoload()</methodname>. Si l'extension <code>spl_autoload</code> n'est pas présente
222 dans l'environnement <acronym>PHP</acronym>, alors la méthode <methodname>registerAutoload()</methodname> lèvera une
223 <classname>Zend_Exception</classname>.
226 <example id="zend.loader.load.autoload.example">
227 <title>Exemple d'inscription de la méthode de callback autoloader</title>
229 <programlisting language="php"><![CDATA[
230 Zend_Loader::registerAutoload();
235 Après avoir inscrit le callback vers l'autoload de Zend Framework, vous pouvez
236 appeler une classe de Zend Framework sans l'avoir explicitement chargé auparavant. La
237 méthode autoload utilise automatiquement <methodname>Zend_Loader::loadClass()</methodname>
238 quand vous appelez une classe.
242 Si vous avez étendu la classe <classname>Zend_Loader</classname>, vous pouvez
243 passer un argument optionnel à <methodname>registerAutoload()</methodname>, pour spécifier la classe
244 de laquelle vous souhaitez enregistrer la méthode <methodname>autoload()</methodname>.
247 <example id="zend.loader.load.autoload.example-extended">
248 <title>Exemple d'inscription de la méthode de callback autoloader d'une classe
252 A cause de la sémantique de référencement des fonctions statiques en <acronym>PHP</acronym>, vous
253 devez implémenter le code pour les méthodes <methodname>loadClass()</methodname> et
254 <methodname>autoload()</methodname>, et la méthode <methodname>autoload()</methodname> doit appeler
255 <methodname>self::loadClass()</methodname>. Si votre méthode <methodname>autoload()</methodname> délégue à
256 son parent l'appel <methodname>self::loadClass()</methodname>, alors cela appellerait la méthode
257 de même nom dans la classe parente et non dans la sous-classe.
260 <programlisting language="php"><![CDATA[
261 class Mon_Chargeur extends Zend_Loader
263 public static function loadClass($class, $dirs = null)
265 parent::loadClass($class, $dirs);
268 public static function autoload($class)
271 self::loadClass($class);
273 } catch (Exception $e) {
278 Zend_Loader::registerAutoload('Mon_Chargeur');
283 Vous pouvez effacer un callback d'autoload. <methodname>registerAutoload()</methodname> a un
284 paramètre optionnel, qui est réglé à <constant>TRUE</constant> par défaut. S'il vaut
285 <constant>FALSE</constant>, le callback de l'autoload est alors effacé de la pile des autoload