| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="learning.autoloading.usage">
- <title>Utilisation de base de l'autoloader</title>
- <para>
- Maintenant que vous savez les buts et le fonctionnement des autoloaders de
- Zend Framework, voyons comment utiliser <classname>Zend_Loader_Autoloader</classname>.
- </para>
- <para>
- Dans le cas le plus simple, vous incluez cette classe et l'instanciez. Comme
- <classname>Zend_Loader_Autoloader</classname> est un singleton (car l'autoloader de la
- <acronym>SPL</acronym> est unique), nous utilisons
- <methodname>getInstance()</methodname> pour en récupérer l'instance.
- </para>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Loader/Autoloader.php';
- Zend_Loader_Autoloader::getInstance();
- ]]></programlisting>
- <para>
- Par défaut, ceci va permettre de charger des classes dont le préfixe est
- "Zend_" ou "ZendX_", si leurs fichiers sont dans votre <property>include_path</property>.
- </para>
- <para>
- Que se passe-t-il si vous avez d'autres espaces de noms à charger? Le mieux et le plus simple
- est alors d'utiliser la méthode <methodname>registerNamespace()</methodname> de l'instance.
- Vous pouvez lui passer un préfixe simple, ou un tableau de préfixes:
- </para>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Loader/Autoloader.php';
- $loader = Zend_Loader_Autoloader::getInstance();
- $loader->registerNamespace('Foo_');
- $loader->registerNamespace(array('Foo_', 'Bar_'));
- ]]></programlisting>
- <para>
- Aussi, vous pouvez indiquer à <classname>Zend_Loader_Autoloader</classname> d'agire comme
- autoloader par défaut ("de secours"). Ceci signifie qu'il essayera de charger toute classe
- peu importe son préfixe.
- </para>
- <programlisting language="php"><![CDATA[
- $loader->setFallbackAutoloader(true);
- ]]></programlisting>
- <warning>
- <title>N'utilisez pas l'autoloader de secours</title>
- <para>
- Ce peut être tentant de se reposer abondamment sur
- <classname>Zend_Loader_Autoloader</classname> comme chargeur de secours, nous ne
- recommandons pas une telle pratique.
- </para>
- <para>
- En interne, <classname>Zend_Loader_Autoloader</classname> utilise
- <methodname>Zend_Loader::loadClass()</methodname> pour charger les classes. Cette
- méthode utilise <methodname>include()</methodname> pour tenter de charger le fichier
- de la classe. <methodname>include()</methodname> retourne <constant>FALSE</constant>
- s'il ne réussi pas -- mais renvoie aussi un warning <acronym>PHP</acronym>. Ce dernier
- point peut mener à des problèmes:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Si <property>display_errors</property> est activé, le warning sera inclus dans
- la sortie (l'affichage).
- </para>
- </listitem>
- <listitem>
- <para>
- Selon le niveau de <property>error_reporting</property>, le warning pourra aussi
- déclencher l'écriture dans les journaux d'évènements.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Vous pouvez supprimer les messages d'erreur (la documentation de
- <classname>Zend_Loader_Autoloader</classname> détaille cela), mais notez bien que la
- suppression n'est utilisée que lorsque <property>display_errors</property> est activé;
- le journal des évènements enregistrera toujours l'erreur. Pour ces raisons, nous vous
- recommandons de bien configurer vos espaces de noms avec l'autoloader.
- </para>
- </warning>
- <note>
- <title>Préfixes d'espaces de nom et espaces de noms PHP</title>
- <para>
- A l'heure de l'écriture de ces lignes, <acronym>PHP</acronym> 5.3 est sorti. Avec
- cette version, <acronym>PHP</acronym> supporte maintenant officiellement les espaces
- de noms.
- </para>
- <para>
- Cependant, Zend Framework date d'avant <acronym>PHP</acronym> 5.3, et donc les espaces
- de noms PHP. Dans Zend Framework, lorsque nous parlons "d'espace de noms", nous parlons
- d'une pratique consistant à préfixer le nom de la classe par un préfixe. Par exemple,
- toutes les classes de Zend Framework commencent par "Zend_" -- c'est notre espace de
- noms.
- </para>
- <para>
- Zend Framework projette de supporter nativement les espaces de noms <acronym>PHP</acronym>
- pour l'autoloader dans les versions futures. Il utilisera aussi ce support en interne, à
- partir de la version 2.0.0.
- </para>
- </note>
- <para>
- Si vous possédez votre propre autoloader et que vous voulez l'utiliser avec Zend Framework
- -- peut être un autoloader provenant d'une autre librairie que vous utilisez -- vous pouvez
- l'enregistrer grâce aux méthodes de <classname>Zend_Loader_Autoloader</classname>
- <methodname>pushAutoloader()</methodname> et <methodname>unshiftAutoloader()</methodname>.
- Ces méthodes ajoutent des autoloaders à la fin ou au début de la chaine utilisée avant
- l'exécution des mecanismes internes d'auto-chargement de Zend Framewor. Cette approche a
- les avantages suivants:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Chaque méthode prend un deuxième paramètre : un espace de noms qui indique que
- l'autoloader passé ne doit être utilisé que pour charger des classes dans cet
- espace de noms là. Si la classe n'est pas dans cet espace de noms, l'autoloader
- sera alors ignoré, ce qui peut amener à des optimisations de performance.
- </para>
- </listitem>
- <listitem>
- <para>
- Si vous devez manipuler le registre de <methodname>spl_autoload()</methodname>,
- prenez garde si vous préciser des fonctions de rappels sous forme de méthodes de
- classes car <methodname>spl_autoload_functions()</methodname> ne retourne pas
- exactement leurs définitions. <classname>Zend_Loader_Autoloader</classname>
- ne souffre pas de ce problème.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Voici une liste de définitions de fonctions de rappel pour auto-chargement valides en
- <acronym>PHP</acronym>.
- </para>
- <programlisting language="php"><![CDATA[
- // Ajoute à la suite de la pile la fonction 'my_autoloader',
- // pour charger des classes commençant par 'My_':
- $loader->pushAutoloader('my_autoloader', 'My_');
- // Ajoute au début de la pile une méthode statique Foo_Loader::autoload(),
- // pour charger des classes commençant par 'Foo_':
- $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
- ]]></programlisting>
- </sect1>
|