1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
<?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>
|