[ZF-10089] Zend_Log
[zend.git] / documentation / manual / fr / tutorials / autoloading-usage.xml
blobb87ca893fc1a781e154890f9f4552a0d9f8c2035
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 19782 -->
3 <!-- Reviewed: no -->
4 <sect1 id="learning.autoloading.usage">
5     <title>Utilisation de base de l'autoloader</title>
7     <para>
8         Maintenant que vous savez les buts et le fonctionnement des autoloaders de
9         Zend Framework, voyons comment utiliser <classname>Zend_Loader_Autoloader</classname>.
10     </para>
12     <para>
13         Dans le cas le plus simple, vous incluez cette classe et l'instanciez. Comme
14         <classname>Zend_Loader_Autoloader</classname> est un singleton (car l'autoloader de la
15         <acronym>SPL</acronym> est unique), nous utilisons
16         <methodname>getInstance()</methodname> pour en récupérer l'instance.
17     </para>
19     <programlisting language="php"><![CDATA[
20 require_once 'Zend/Loader/Autoloader.php';
21 Zend_Loader_Autoloader::getInstance();
22 ]]></programlisting>
24     <para>
25         Par défaut, ceci va permettre de charger des classes dont le préfixe est
26         "Zend_" ou "ZendX_", si leurs fichiers sont dans votre <property>include_path</property>.
27     </para>
29     <para>
30         Que se passe-t-il si vous avez d'autres espaces de noms à charger? Le mieux et le plus simple
31         est alors d'utiliser la méthode <methodname>registerNamespace()</methodname> de l'instance.
32         Vous pouvez lui passer un préfixe simple, ou un tableau de préfixes:
33     </para>
35     <programlisting language="php"><![CDATA[
36 require_once 'Zend/Loader/Autoloader.php';
37 $loader = Zend_Loader_Autoloader::getInstance();
38 $loader->registerNamespace('Foo_');
39 $loader->registerNamespace(array('Foo_', 'Bar_'));
40 ]]></programlisting>
42     <para>
43         Aussi, vous pouvez indiquer à <classname>Zend_Loader_Autoloader</classname> d'agire comme
44         autoloader par défaut ("de secours"). Ceci signifie qu'il essayera de charger toute classe
45         peu importe son préfixe.
46     </para>
48     <programlisting language="php"><![CDATA[
49 $loader->setFallbackAutoloader(true);
50 ]]></programlisting>
52     <warning>
53         <title>N'utilisez pas l'autoloader de secours</title>
55         <para>
56             Ce peut être tentant de se reposer abondamment sur
57             <classname>Zend_Loader_Autoloader</classname> comme chargeur de secours, nous ne
58             recommandons pas une telle pratique.
59         </para>
61         <para>
62             En interne, <classname>Zend_Loader_Autoloader</classname> utilise
63             <methodname>Zend_Loader::loadClass()</methodname> pour charger les classes. Cette
64             méthode utilise <methodname>include()</methodname> pour tenter de charger le fichier
65             de la classe. <methodname>include()</methodname> retourne <constant>FALSE</constant>
66             s'il ne réussi pas -- mais renvoie aussi un warning <acronym>PHP</acronym>. Ce dernier
67             point peut mener à des problèmes:
68         </para>
70         <itemizedlist>
71             <listitem>
72                 <para>
73                     Si <property>display_errors</property> est activé, le warning sera inclus dans
74                     la sortie (l'affichage).
75                 </para>
76             </listitem>
78             <listitem>
79                 <para>
80                     Selon le niveau de <property>error_reporting</property>, le warning pourra aussi
81                     déclencher l'écriture dans les journaux d'évènements.
82                 </para>
83             </listitem>
84         </itemizedlist>
86         <para>
87             Vous pouvez supprimer les messages d'erreur (la documentation de
88             <classname>Zend_Loader_Autoloader</classname> détaille cela), mais notez bien que la
89             suppression n'est utilisée que lorsque <property>display_errors</property> est activé;
90             le journal des évènements enregistrera toujours l'erreur. Pour ces raisons, nous vous
91             recommandons de bien configurer vos espaces de noms avec l'autoloader.
92         </para>
93     </warning>
95     <note>
96         <title>Préfixes d'espaces de nom et espaces de noms PHP</title>
98         <para>
99             A l'heure de l'écriture de ces lignes, <acronym>PHP</acronym> 5.3 est sorti. Avec
100             cette version, <acronym>PHP</acronym> supporte maintenant officiellement les espaces
101             de noms.
102         </para>
104         <para>
105             Cependant, Zend Framework date d'avant <acronym>PHP</acronym> 5.3, et donc les espaces
106             de noms PHP. Dans Zend Framework, lorsque nous parlons "d'espace de noms", nous parlons
107             d'une pratique consistant à préfixer le nom de la classe par un préfixe. Par exemple,
108             toutes les classes de Zend Framework commencent par "Zend_" -- c'est notre espace de
109             noms.
110         </para>
112         <para>
113             Zend Framework projette de supporter nativement les espaces de noms <acronym>PHP</acronym>
114             pour l'autoloader dans les versions futures. Il utilisera aussi ce support en interne, à
115             partir de la version 2.0.0.
116         </para>
117     </note>
119     <para>
120         Si vous possédez votre propre autoloader et que vous voulez l'utiliser avec Zend Framework
121         -- peut être un autoloader provenant d'une autre librairie que vous utilisez -- vous pouvez
122         l'enregistrer grâce aux méthodes de <classname>Zend_Loader_Autoloader</classname>
123         <methodname>pushAutoloader()</methodname> et <methodname>unshiftAutoloader()</methodname>.
124         Ces méthodes ajoutent des autoloaders à la fin ou au début de la chaine utilisée avant
125         l'exécution des mecanismes internes d'auto-chargement de Zend Framewor. Cette approche a
126         les avantages suivants:
127     </para>
129     <itemizedlist>
130         <listitem>
131             <para>
132                 Chaque méthode prend un deuxième paramètre : un espace de noms qui indique que
133                 l'autoloader passé ne doit être utilisé que pour charger des classes dans cet
134                 espace de noms là. Si la classe n'est pas dans cet espace de noms, l'autoloader
135                 sera alors ignoré, ce qui peut amener à des optimisations de performance.
136             </para>
137         </listitem>
139         <listitem>
140             <para>
141                 Si vous devez manipuler le registre de <methodname>spl_autoload()</methodname>,
142                 prenez garde si vous préciser des fonctions de rappels sous forme de méthodes de
143                 classes car <methodname>spl_autoload_functions()</methodname> ne retourne pas
144                 exactement leurs définitions. <classname>Zend_Loader_Autoloader</classname>
145                 ne souffre pas de ce problème.
146             </para>
147         </listitem>
148     </itemizedlist>
150     <para>
151         Voici une liste de définitions de fonctions de rappel pour auto-chargement valides en
152         <acronym>PHP</acronym>.
153     </para>
155     <programlisting language="php"><![CDATA[
156 // Ajoute à la suite de la pile la fonction 'my_autoloader',
157 // pour charger des classes commençant par 'My_':
158 $loader->pushAutoloader('my_autoloader', 'My_');
160 // Ajoute au début de la pile une méthode statique Foo_Loader::autoload(),
161 // pour charger des classes commençant par 'Foo_':
162 $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
163 ]]></programlisting>
164 </sect1>