Zend_Loader-Autoloader.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.loader.autoloader">
  5. <title>Der Autoloader</title>
  6. <para>
  7. <classname>Zend_Loader_Autoloader</classname> ist eine vollständige Autoloader Lösung für den
  8. Zend Framework. Sie wurde entwickelt um verschiedene Ziele zu lösen:
  9. </para>
  10. <itemizedlist>
  11. <listitem><para>
  12. Einen echten Namespace Autoloader bieten. (Frühere Inkarnationen waren mit
  13. Namespaces auf Benutzerebene verknüpft)
  14. </para></listitem>
  15. <listitem><para>
  16. Es zu erlauben eigene Callbacks als Autoloader zu registrieren und diese als Stack
  17. zu managen. (Zu der als das geschrieben wirde gab es einige Probleme mit
  18. <code>spl_autoload</code>, welche es nicht erlaubten einen Callback erneut zu
  19. registrieren wenn dieser eine Instanzmethode verwendet.)
  20. </para></listitem>
  21. <listitem><para>
  22. Er zu erlauben Namespaces optimiert zu matchen um schnellere Auflösung der Klasse
  23. zu erlauben.
  24. </para></listitem>
  25. </itemizedlist>
  26. <para>
  27. <classname>Zend_Loader_Autoloader</classname> implementiert ein Singleton, was es universell
  28. verwendbar macht. Das bietet die Möglichkeit zusätzlich Autoloader von überall im eigenen
  29. Code zu registrieren wo es notwendig ist.
  30. </para>
  31. <sect2 id="zend.loader.autoloader.usage">
  32. <title>Verwenden des Autoloaders</title>
  33. <para>
  34. Das erste Mal wenn eine Instanz des Autoloaders empfangen wird, registriert dieser sich
  35. mit <code>spl_autoload</code>. Man kann eine Instanz erhalten indem die
  36. <code>getInstance()</code> Methode verwendet wird:
  37. </para>
  38. <programlisting role="php"><![CDATA[
  39. $autoloader = Zend_Loader_Autoloader::getInstance();
  40. ]]></programlisting>
  41. <para>
  42. Standardmäßig ist der Autloader so konfiguriert das er den "Zend_" und "ZendX_"
  43. Namespaces entspricht. Wenn man seinen eigenen Bibliothekscode hat der seinen eigenen
  44. Namespace verwendet, kann man Ihn mit dem Autoloader registrieren indem die
  45. <code>registerNamespace()</code> Methode verwendet. Wenn der eigene Blbliothekscode
  46. ein Präfix von "My_" hat, könnte man auch folgendes tun:
  47. </para>
  48. <programlisting role="php"><![CDATA[
  49. $autoloader->registerNamespace('My_');
  50. ]]></programlisting>
  51. <note>
  52. <title>Namespace Präfixe</title>
  53. <para>
  54. Man sollte beachten das das vorhergehende Beispiel "My_" verwendet und nicht "My".
  55. Der Grund ist, das <classname>Zend_Loader_Autoloader</classname> als Autoloader für generelle
  56. Anwendungsfälle gedacht ist, und deshalb nicht die Annahme macht das ein
  57. angegebener Präfix eines Klassen Namespaces einen Unterstrich enthalten muß. Wenn
  58. der eigene Klassennamespace einen <emphasis>enhält</emphasis>, dann sollte man Ihn
  59. mit dem eigenen Namespace registrieren.
  60. </para>
  61. </note>
  62. <para>
  63. Man kann auch einen eigene Autoloader Callbacks registrieren, optional mit einem
  64. spezifischen Namespace (oder einer Gruppe von Namespaces).
  65. <classname>Zend_Loader_Autoloader</classname> versucht zuerst die passenden zu finden bevor
  66. sein interner Autoloading Mechanismus verwendet wird.
  67. </para>
  68. <para>
  69. Man könnte, als Beispiel, ein oder mehrere eZcomponents Komponenten mit der eigenen
  70. Zend Framework Anwendung verwenden wollen. Um deren Autoloading Möglichkeiten zu
  71. verwenden, müssen diese auf den Autoloader Stack gepusht werden indem man
  72. <code>pushAutoloader()</code> verwendet:
  73. </para>
  74. <programlisting role="php"><![CDATA[
  75. $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
  76. ]]></programlisting>
  77. <para>
  78. Das zeigt dem Autoloader das der eZcomponents Autoloader für Klassen zu verwenden ist
  79. die mit "ezc" anfangen.
  80. </para>
  81. <para>
  82. Man kann die <code>unshiftAutoloader()</code> Methode verwenden um den Autoloader
  83. an den Anfang der Autoloader Kette hinzu zu fügen.
  84. </para>
  85. <para>
  86. Standmäßig, macht <classname>Zend_Loader_Autoloader</classname> keine Fehlerunterdrückung
  87. wenn sein interner Autoloader verwendet wird, der seinerseits
  88. <classname>Zend_Loader::loadClass()</classname> verwendet. Die meiste Zeit ist das genau
  89. das was man will. Trotzdem, gibt es Fälle in denen man Sie unterdrücken will.
  90. Man das mit Hilfe von <code>suppressNotFoundWarnings()</code> tun:
  91. </para>
  92. <programlisting role="php"><![CDATA[
  93. $autoloader->suppressNotFoundWarnings(true);
  94. ]]></programlisting>
  95. <para>
  96. Letztendlich kann es Zeiten geben in denen man will das der Autoloader irgendeinen
  97. Namespace verwendet. Zum Beispiel verwenden die PEAR Bibliotheken keinen gemeinsamen
  98. Namespace, was es schwierig macht individuelle Namespaces zu spezifizieren wenn viele
  99. PEAR Komponenten verwendet werden. Man kann die <code>setFallbackAutoloader()</code>
  100. Methode verwenden damit der Autoloader als catch-all arbeitet:
  101. </para>
  102. <programlisting role="php"><![CDATA[
  103. $autoloader->setFallbackAutoloader(true);
  104. ]]></programlisting>
  105. </sect2>
  106. <sect2 id="zend.loader.autoloader.interface">
  107. <title>Das Autoloader Interface</title>
  108. <para>
  109. Neben der Möglichkeit eigene Callbacks als Autoloader zu spezifizieren, definiert
  110. Zend Framework auch ein Interface für Autoloading Klassen,
  111. <classname>Zend_Loader_Autoloader_Interface</classname>, das implementiert werden kann:
  112. </para>
  113. <programlisting role="php"><![CDATA[
  114. interface Zend_Loader_Autoloader_Interface
  115. {
  116. public function autoload($class);
  117. }
  118. ]]></programlisting>
  119. <para>
  120. Wenn das Interface verwendet wird, kann man einfach eine Klasseninstanz an
  121. <classname>Zend_Loader_Autoloader</classname>'s <code>pushAutoloader()</code> und
  122. <code>unshiftAutoloader()</code> Methoden übergeben:
  123. </para>
  124. <programlisting role="php"><![CDATA[
  125. // Angenommen Foo_Autoloader implementiert Zend_Loader_Autoloader_Interface:
  126. $foo = new Foo_Autoloader();
  127. $autoloader->pushAutoloader($foo, 'Foo_');
  128. ]]></programlisting>
  129. </sect2>
  130. <sect2 id="zend.loader.autoloader.reference">
  131. <title>Autoloader Referenz</title>
  132. <para>
  133. Anbei kann ein Wegweiser für die Methoden gefunden werden die in
  134. <classname>Zend_Loader_Autoloader</classname> vorhanden sind.
  135. </para>
  136. <table id="zend.loader.autoloader.reference.api">
  137. <title>Zend_Loader_Autoloader Methoden</title>
  138. <tgroup cols="4">
  139. <thead>
  140. <row>
  141. <entry>Methode</entry>
  142. <entry>Rückgabewert</entry>
  143. <entry>Parameter</entry>
  144. <entry>Beschreibung</entry>
  145. </row>
  146. </thead>
  147. <tbody>
  148. <row>
  149. <entry><code>getInstance()</code></entry>
  150. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  151. <entry>N/A</entry>
  152. <entry><para>
  153. empfängt die Singleton Instanz von <classname>Zend_Loader_Autoloader</classname>.
  154. Beim ersten Empfang registriert sich diese selbst bei
  155. <code>spl_autoload</code>. Diese Methode ist statisch.
  156. </para></entry>
  157. </row>
  158. <row>
  159. <entry><code>resetInstance()</code></entry>
  160. <entry><code>void</code></entry>
  161. <entry>N/A</entry>
  162. <entry><para>
  163. Resetiert den Status der Singleton Instanz von
  164. <classname>Zend_Loader_Autoloader</classname> zu dem originalen Status,
  165. de-registriert alle Autoloader Callbacks und alle registrierten
  166. Namespaces.
  167. </para></entry>
  168. </row>
  169. <row>
  170. <entry><code>autoload($class)</code></entry>
  171. <entry><code>string|false</code></entry>
  172. <entry><itemizedlist>
  173. <listitem><para>
  174. <code>$class</code>, <emphasis>Benötigt</emphasis>.
  175. Der String eines Klassennamens der geladen werden soll.
  176. </para></listitem>
  177. </itemizedlist></entry>
  178. <entry><para>
  179. Versucht einen Klassennamen zu einer Datei aufzulösen und diese zu
  180. laden.
  181. </para></entry>
  182. </row>
  183. <row>
  184. <entry><code>setDefaultAutoloader($callback)</code></entry>
  185. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  186. <entry><itemizedlist>
  187. <listitem><para>
  188. <code>$callback</code>, <emphasis>Benötigt</emphasis>.
  189. </para></listitem>
  190. </itemizedlist></entry>
  191. <entry><para>
  192. Spezifiziert einen alternativen PHP Callback der für die standardmäßige
  193. Autoloader Implementation verwendet werden soll.
  194. </para></entry>
  195. </row>
  196. <row>
  197. <entry><code>getDefaultAutoloader()</code></entry>
  198. <entry><code>callback</code></entry>
  199. <entry>N/A</entry>
  200. <entry><para>
  201. Empfängt die standardmäßige Autoloader Implementation; standardmäßig
  202. ist das <classname>Zend_Loader::loadClass()</classname>.
  203. </para></entry>
  204. </row>
  205. <row>
  206. <entry><code>setAutoloaders(array $autoloaders)</code></entry>
  207. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  208. <entry><itemizedlist>
  209. <listitem><para>
  210. <code>$autoloaders</code>, <emphasis>Benötigt</emphasis>.
  211. </para></listitem>
  212. </itemizedlist></entry>
  213. <entry><para>
  214. Setzt eine Liste von konkreten Autoloadern für deren Verwendung in den
  215. Autoloader Stack. Jedes Element im Autoloader Array muß ein PHP
  216. Callback sein.
  217. </para></entry>
  218. </row>
  219. <row>
  220. <entry><code>getAutoloaders()</code></entry>
  221. <entry><code>array</code></entry>
  222. <entry>N/A</entry>
  223. <entry><para>
  224. Empfängt den internen Autoloader Stack.
  225. </para></entry>
  226. </row>
  227. <row>
  228. <entry><code>getNamespaceAutoloaders($namespace)</code></entry>
  229. <entry><code>array</code></entry>
  230. <entry><itemizedlist>
  231. <listitem><para>
  232. <code>$namespace</code>, <emphasis>Benötigt</emphasis>
  233. </para></listitem>
  234. </itemizedlist></entry>
  235. <entry><para>
  236. Holt alle Autoloader die registriert wurden um mit einem spezifischen
  237. Namespace geladen zu werden.
  238. </para></entry>
  239. </row>
  240. <row>
  241. <entry><code>registerNamespace($namespace)</code></entry>
  242. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  243. <entry><itemizedlist>
  244. <listitem><para>
  245. <code>$namespace</code>, <emphasis>Benötigt</emphasis>.
  246. </para></listitem>
  247. </itemizedlist></entry>
  248. <entry><para>
  249. Registriert ein oder mehrere Namespaces mit dem standardmäßigen
  250. Autoloader. Wenn <code>$namespace</code> ein String ist, registriert
  251. er diesen Namespace; wenn er ein Array von Strings ist, registriert er
  252. jeden als Namespace.
  253. </para></entry>
  254. </row>
  255. <row>
  256. <entry><code>unregisterNamespace($namespace)</code></entry>
  257. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  258. <entry><itemizedlist>
  259. <listitem><para>
  260. <code>$namespace</code>, <emphasis>Benötigt</emphasis>.
  261. </para></listitem>
  262. </itemizedlist></entry>
  263. <entry><para>
  264. De-Registriert ein oder mehrere Namespaces vom standardmäßigen
  265. Autoloader. Wenn <code>$namespace</code> ein String ist, de-registriert
  266. er diesen Namespace; wenn er ein Array von Strings ist, de-registriert
  267. er jeden davon als Namespace.
  268. </para></entry>
  269. </row>
  270. <row>
  271. <entry><code>getRegisteredNamespace()</code></entry>
  272. <entry><code>array</code></entry>
  273. <entry>N/A</entry>
  274. <entry><para>
  275. Gibt ein Array aller Namespaces zurück die mit dem standardmäßigen
  276. Autoloader registriert sind.
  277. </para></entry>
  278. </row>
  279. <row>
  280. <entry><code>suppressNotFoundWarnings($flag = null)</code></entry>
  281. <entry><code>boolean|Zend_Loader_Autoloader</code></entry>
  282. <entry><itemizedlist>
  283. <listitem><para>
  284. <code>$flag</code>, <emphasis>Optional</emphasis>.
  285. </para></listitem>
  286. </itemizedlist></entry>
  287. <entry><para>
  288. Setzt oder Empfängt den Wert des Flags das verwendet wird um anzuzeigen
  289. ob die standardmäßige Autoloader Implementation "file not found"
  290. Warnungen unterdrücken soll oder nicht. Wenn keine Argumente oder ein
  291. null Wert übergeben wird, wird ein Boolscher Wert zurückgegeben der den
  292. Status des Flags anzeigt; wenn ein Boolean übergeben wurde, wird das
  293. Flag auf den Wert gesetzt und die Autoloader Instanz wird zurückgegeben
  294. (um die Verkettung von Methoden zu erlauben).
  295. </para></entry>
  296. </row>
  297. <row>
  298. <entry><code>setFallbackAutoloader($flag)</code></entry>
  299. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  300. <entry><itemizedlist>
  301. <listitem><para>
  302. <code>$flag</code>, <emphasis>Benötigt</emphasis>.
  303. </para></listitem>
  304. </itemizedlist></entry>
  305. <entry><para>
  306. Setzt den Wert des Flags das verwendet wird um anzuzeigen ob der
  307. standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
  308. für alle Namespaces verwendet werden soll.
  309. </para></entry>
  310. </row>
  311. <row>
  312. <entry><code>isFallbackAutoloader()</code></entry>
  313. <entry><code>boolean</code></entry>
  314. <entry>N/A</entry>
  315. <entry><para>
  316. Empfängt den Wert des Flags das verwendet wird um anzuzeigen ob der
  317. standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
  318. für alle Namespaces verwendet wird. Standardmäßig ist er false.
  319. </para></entry>
  320. </row>
  321. <row>
  322. <entry><code>getClassAutoloaders($class)</code></entry>
  323. <entry><code>array</code></entry>
  324. <entry><itemizedlist>
  325. <listitem><para>
  326. <code>$class</code>, <emphasis>Benötigt</emphasis>.
  327. </para></listitem>
  328. </itemizedlist></entry>
  329. <entry><para>
  330. Gibt eine Liste von Namespaced Autoloadern zurück die der angegebenen
  331. Klasse potentiell entsprechen. Wenn keine passt, werden alle globalen
  332. (nicht ge-namespaceten Autoloader) zurückgegeben.
  333. </para></entry>
  334. </row>
  335. <row>
  336. <entry><code>unshiftAutoloader($callback, $namespace = '')</code></entry>
  337. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  338. <entry><itemizedlist>
  339. <listitem><para>
  340. <code>$callback</code>, <emphasis>Benötigt</emphasis>.
  341. Ein gültiger PHP Callback.
  342. </para></listitem>
  343. <listitem><para>
  344. <code>$namespace</code>, <emphasis>Optional</emphasis>.
  345. Ein String der einen Klassenpräfix Namespace repräsentiert.
  346. </para></listitem>
  347. </itemizedlist></entry>
  348. <entry><para>
  349. Fügt eine konkrete Autoloader Implementation an den Anfang des
  350. Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
  351. Namespace verwendet um optimistischerweise zu passen; andernfalls wird
  352. angenommen das der Autoloader ein globaler Autoloader ist.
  353. </para></entry>
  354. </row>
  355. <row>
  356. <entry><code>pushAutoloader($callback, $namespace = '')</code></entry>
  357. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  358. <entry><itemizedlist>
  359. <listitem><para>
  360. <code>$callback</code>, <emphasis>Benötigt</emphasis>.
  361. Ein gültiger PHP Callback
  362. </para></listitem>
  363. <listitem><para>
  364. <code>$namespace</code>, <emphasis>Optional</emphasis>.
  365. Ein String der einen Klassenpräfix Namespace repräsentiert.
  366. </para></listitem>
  367. </itemizedlist></entry>
  368. <entry><para>
  369. Fügt eine konkrete Autoloader Implementation an das Ende des internen
  370. Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
  371. Namespace verwendet um optimistischerweise zu passen; andernfalls wird
  372. angenommen das der Autoloader ein globaler Autoloader ist.
  373. </para></entry>
  374. </row>
  375. <row>
  376. <entry><code>removeAutoloader($callback, $namespace = '')</code></entry>
  377. <entry><classname>Zend_Loader_Autoloader</classname></entry>
  378. <entry><itemizedlist>
  379. <listitem><para>
  380. <code>$callback</code>, <emphasis>Benötigt</emphasis>.
  381. Ein gültiger PHP Callback
  382. </para></listitem>
  383. <listitem><para>
  384. <code>$namespace</code>, <emphasis>Optional</emphasis>.
  385. Ein String der einen Klassenpräfix Namespace repräsentiert oder ein
  386. Array von Namespace Strings.
  387. </para></listitem>
  388. </itemizedlist></entry>
  389. <entry><para>
  390. Entfernt eine konkrete Autoloader Implementation vom internen Autoloader
  391. Stack. Wenn ein Namespace oder mehrere Namespaces angegeben werden, wird
  392. der Callback nur vom angegebenen Namespace oder den angegebenen
  393. Namespaces entfernt.
  394. </para></entry>
  395. </row>
  396. </tbody>
  397. </tgroup>
  398. </table>
  399. </sect2>
  400. </sect1>