<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 17175 -->
<!-- Reviewed: no -->
<sect1 id="zend.loader.autoloader">
    <title>Der Autoloader</title>

    <para>
        <classname>Zend_Loader_Autoloader</classname> ist eine vollständige Autoloader Lösung für
        den Zend Framework. Sie wurde entwickelt um verschiedene Ziele zu lösen:
    </para>

    <itemizedlist>
        <listitem><para>
            Einen echten Namespace Autoloader bieten. (Frühere Inkarnationen waren mit
            Namespaces auf Benutzerebene verknüpft)
        </para></listitem>

        <listitem><para>
            Es zu erlauben eigene Callbacks als Autoloader zu registrieren und diese als Stack
            zu managen. (Zu der als das geschrieben wirde gab es einige Probleme mit
            <code>spl_autoload</code>, welche es nicht erlaubten einen Callback erneut zu
            registrieren wenn dieser eine Instanzmethode verwendet.)
        </para></listitem>

        <listitem><para>
            Er zu erlauben Namespaces optimiert zu matchen um schnellere Auflösung der Klasse
            zu erlauben.
        </para></listitem>
    </itemizedlist>

    <para>
        <classname>Zend_Loader_Autoloader</classname> implementiert ein Singleton, was es universell
        verwendbar macht. Das bietet die Möglichkeit zusätzlich Autoloader von überall im eigenen
        Code zu registrieren wo es notwendig ist.
    </para>

    <sect2 id="zend.loader.autoloader.usage">
        <title>Verwenden des Autoloaders</title>

        <para>
            Das erste Mal wenn eine Instanz des Autoloaders empfangen wird, registriert dieser sich
            mit <code>spl_autoload</code>. Man kann eine Instanz erhalten indem die
            <methodname>getInstance()</methodname> Methode verwendet wird:
        </para>

        <programlisting language="php"><![CDATA[
$autoloader = Zend_Loader_Autoloader::getInstance();
]]></programlisting>

        <para>
            Standardmäßig ist der Autloader so konfiguriert das er den "Zend_" und "ZendX_"
            Namespaces entspricht. Wenn man seinen eigenen Bibliothekscode hat der seinen eigenen
            Namespace verwendet, kann man Ihn mit dem Autoloader registrieren indem die
            <methodname>registerNamespace()</methodname> Methode verwendet. Wenn der eigene
            Blbliothekscode ein Präfix von "My_" hat, könnte man auch folgendes tun:
        </para>

        <programlisting language="php"><![CDATA[
$autoloader->registerNamespace('My_');
]]></programlisting>

        <note>
            <title>Namespace Präfixe</title>

            <para>
                Man sollte beachten das das vorhergehende Beispiel "My_" verwendet und nicht "My".
                Der Grund ist, das <classname>Zend_Loader_Autoloader</classname> als Autoloader für
                generelle Anwendungsfälle gedacht ist, und deshalb nicht die Annahme macht das ein
                angegebener Präfix eines Klassen Namespaces einen Unterstrich enthalten muß. Wenn
                der eigene Klassennamespace einen <emphasis>enhält</emphasis>, dann sollte man Ihn
                mit dem eigenen Namespace registrieren.
            </para>
        </note>

        <para>
            Man kann auch einen eigene Autoloader Callbacks registrieren, optional mit einem
            spezifischen Namespace (oder einer Gruppe von Namespaces).
            <classname>Zend_Loader_Autoloader</classname> versucht zuerst die passenden zu finden
            bevor sein interner Autoloading Mechanismus verwendet wird.
        </para>

        <para>
            Man könnte, als Beispiel, ein oder mehrere eZcomponents Komponenten mit der eigenen
            Zend Framework Anwendung verwenden wollen. Um deren Autoloading Möglichkeiten zu
            verwenden, müssen diese auf den Autoloader Stack gepusht werden indem man
            <methodname>pushAutoloader()</methodname> verwendet:
        </para>

        <programlisting language="php"><![CDATA[
$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
]]></programlisting>

        <para>
            Das zeigt dem Autoloader das der eZcomponents Autoloader für Klassen zu verwenden ist
            die mit "ezc" anfangen.
        </para>

        <para>
            Man kann die <methodname>unshiftAutoloader()</methodname> Methode verwenden um den
            Autoloader an den Anfang der Autoloader Kette hinzu zu fügen.
        </para>

        <para>
            Standmäßig, macht <classname>Zend_Loader_Autoloader</classname> keine
            Fehlerunterdrückung wenn sein interner Autoloader verwendet wird, der seinerseits
            <methodname>Zend_Loader::loadClass()</methodname> verwendet. Die meiste Zeit ist das
            genau das was man will. Trotzdem, gibt es Fälle in denen man Sie unterdrücken will.
            Man das mit Hilfe von <methodname>suppressNotFoundWarnings()</methodname> tun:
        </para>

        <programlisting language="php"><![CDATA[
$autoloader->suppressNotFoundWarnings(true);
]]></programlisting>

        <para>
            Letztendlich kann es Zeiten geben in denen man will das der Autoloader irgendeinen
            Namespace verwendet. Zum Beispiel verwenden die PEAR Bibliotheken keinen gemeinsamen
            Namespace, was es schwierig macht individuelle Namespaces zu spezifizieren wenn viele
            PEAR Komponenten verwendet werden. Man kann die
            <methodname>setFallbackAutoloader()</methodname> Methode verwenden damit der Autoloader
            als catch-all arbeitet:
        </para>

        <programlisting language="php"><![CDATA[
$autoloader->setFallbackAutoloader(true);
]]></programlisting>
    </sect2>

    <sect2 id="zend.loader.autoloader.interface">
        <title>Das Autoloader Interface</title>

        <para>
            Neben der Möglichkeit eigene Callbacks als Autoloader zu spezifizieren, definiert
            Zend Framework auch ein Interface für Autoloading Klassen,
            <classname>Zend_Loader_Autoloader_Interface</classname>, das implementiert werden kann:
        </para>

        <programlisting language="php"><![CDATA[
interface Zend_Loader_Autoloader_Interface
{
    public function autoload($class);
}
]]></programlisting>

        <para>
            Wenn das Interface verwendet wird, kann man einfach eine Klasseninstanz an
            <classname>Zend_Loader_Autoloader</classname>'s
            <methodname>pushAutoloader()</methodname> und
            <methodname>unshiftAutoloader()</methodname> Methoden übergeben:
        </para>

        <programlisting language="php"><![CDATA[
// Angenommen Foo_Autoloader implementiert Zend_Loader_Autoloader_Interface:
$foo = new Foo_Autoloader();

$autoloader->pushAutoloader($foo, 'Foo_');
]]></programlisting>
    </sect2>

    <sect2 id="zend.loader.autoloader.reference">
        <title>Autoloader Referenz</title>

        <para>
            Anbei kann ein Wegweiser für die Methoden gefunden werden die in
            <classname>Zend_Loader_Autoloader</classname> vorhanden sind.
        </para>

        <table id="zend.loader.autoloader.reference.api">
            <title>Zend_Loader_Autoloader Methoden</title>
            <tgroup cols="4">
                <thead>
                    <row>
                        <entry>Methode</entry>
                        <entry>Rückgabewert</entry>
                        <entry>Parameter</entry>
                        <entry>Beschreibung</entry>
                    </row>
                </thead>
                <tbody>
                    <row>
                        <entry><methodname>getInstance()</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            empfängt die Singleton Instanz von
                            <classname>Zend_Loader_Autoloader</classname>. Beim ersten Empfang
                            registriert sich diese selbst bei <code>spl_autoload</code>. Diese
                            Methode ist statisch.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>resetInstance()</methodname></entry>
                        <entry><code>void</code></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            Resetiert den Status der Singleton Instanz von
                            <classname>Zend_Loader_Autoloader</classname> zu dem originalen Status,
                            de-registriert alle Autoloader Callbacks und alle registrierten
                            Namespaces.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>autoload($class)</methodname></entry>
                        <entry><code>string|false</code></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$class</varname>, <emphasis>Benötigt</emphasis>.
                                Der String eines Klassennamens der geladen werden soll.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Versucht einen Klassennamen zu einer Datei aufzulösen und diese zu
                            laden.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>setDefaultAutoloader($callback)</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$callback</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Spezifiziert einen alternativen <acronym>PHP</acronym> Callback der für
                            die standardmäßige Autoloader Implementation verwendet werden soll.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>getDefaultAutoloader()</methodname></entry>
                        <entry><code>callback</code></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            Empfängt die standardmäßige Autoloader Implementation; standardmäßig
                            ist das <methodname>Zend_Loader::loadClass()</methodname>.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>setAutoloaders(array $autoloaders)</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$autoloaders</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Setzt eine Liste von konkreten Autoloadern für deren Verwendung in den
                            Autoloader Stack. Jedes Element im Autoloader Array muß ein
                            <acronym>PHP</acronym> Callback sein.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>getAutoloaders()</methodname></entry>
                        <entry><type>Array</type></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            Empfängt den internen Autoloader Stack.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>getNamespaceAutoloaders($namespace)</methodname></entry>
                        <entry><type>Array</type></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Benötigt</emphasis>
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Holt alle Autoloader die registriert wurden um mit einem spezifischen
                            Namespace geladen zu werden.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>registerNamespace($namespace)</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Registriert ein oder mehrere Namespaces mit dem standardmäßigen
                            Autoloader. Wenn <varname>$namespace</varname> ein String ist,
                            registriert er diesen Namespace; wenn er ein Array von Strings ist,
                            registriert er jeden als Namespace.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>unregisterNamespace($namespace)</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            De-Registriert ein oder mehrere Namespaces vom standardmäßigen
                            Autoloader. Wenn <varname>$namespace</varname> ein String ist,
                            de-registriert er diesen Namespace; wenn er ein Array von Strings ist,
                            de-registriert er jeden davon als Namespace.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>getRegisteredNamespace()</methodname></entry>
                        <entry><type>Array</type></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            Gibt ein Array aller Namespaces zurück die mit dem standardmäßigen
                            Autoloader registriert sind.
                        </para></entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>suppressNotFoundWarnings($flag = null)</methodname>
                        </entry>
                        <entry><code>boolean|Zend_Loader_Autoloader</code></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$flag</varname>, <emphasis>Optional</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Setzt oder Empfängt den Wert des Flags das verwendet wird um anzuzeigen
                            ob die standardmäßige Autoloader Implementation "file not found"
                            Warnungen unterdrücken soll oder nicht. Wenn keine Argumente oder ein
                            null Wert übergeben wird, wird ein Boolscher Wert zurückgegeben der den
                            Status des Flags anzeigt; wenn ein Boolean übergeben wurde, wird das
                            Flag auf den Wert gesetzt und die Autoloader Instanz wird zurückgegeben
                            (um die Verkettung von Methoden zu erlauben).
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>setFallbackAutoloader($flag)</methodname></entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$flag</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Setzt den Wert des Flags das verwendet wird um anzuzeigen ob der
                            standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
                            für alle Namespaces verwendet werden soll.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>isFallbackAutoloader()</methodname></entry>
                        <entry><type>Boolean</type></entry>
                        <entry>N/A</entry>
                        <entry><para>
                            Empfängt den Wert des Flags das verwendet wird um anzuzeigen ob der
                            standardmäßige Autoloader als Fallback, oder Catch-All Autoloader
                            für alle Namespaces verwendet wird. Standardmäßig ist er false.
                        </para></entry>
                    </row>

                    <row>
                        <entry><methodname>getClassAutoloaders($class)</methodname></entry>
                        <entry><type>Array</type></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$class</varname>, <emphasis>Benötigt</emphasis>.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Gibt eine Liste von Namespaced Autoloadern zurück die der angegebenen
                            Klasse potentiell entsprechen. Wenn keine passt, werden alle globalen
                            (nicht ge-namespaceten Autoloader) zurückgegeben.
                        </para></entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>unshiftAutoloader($callback, $namespace = '')</methodname>
                        </entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$callback</varname>, <emphasis>Benötigt</emphasis>.
                                Ein gültiger <acronym>PHP</acronym> Callback.
                            </para></listitem>

                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Optional</emphasis>.
                                Ein String der einen Klassenpräfix Namespace repräsentiert.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Fügt eine konkrete Autoloader Implementation an den Anfang des
                            Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
                            Namespace verwendet um optimistischerweise zu passen; andernfalls wird
                            angenommen das der Autoloader ein globaler Autoloader ist.
                        </para></entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>pushAutoloader($callback, $namespace = '')</methodname>
                        </entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$callback</varname>, <emphasis>Benötigt</emphasis>.
                                Ein gültiger <acronym>PHP</acronym> Callback
                            </para></listitem>

                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Optional</emphasis>.
                                Ein String der einen Klassenpräfix Namespace repräsentiert.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Fügt eine konkrete Autoloader Implementation an das Ende des internen
                            Autoloader Stacks hinzu. Wenn ein Namespace angegeben wird, wird dieser
                            Namespace verwendet um optimistischerweise zu passen; andernfalls wird
                            angenommen das der Autoloader ein globaler Autoloader ist.
                        </para></entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>removeAutoloader($callback, $namespace = '')</methodname>
                        </entry>
                        <entry><classname>Zend_Loader_Autoloader</classname></entry>
                        <entry><itemizedlist>
                            <listitem><para>
                                <varname>$callback</varname>, <emphasis>Benötigt</emphasis>.
                                Ein gültiger <acronym>PHP</acronym> Callback
                            </para></listitem>

                            <listitem><para>
                                <varname>$namespace</varname>, <emphasis>Optional</emphasis>.
                                Ein String der einen Klassenpräfix Namespace repräsentiert oder ein
                                Array von Namespace Strings.
                            </para></listitem>
                        </itemizedlist></entry>
                        <entry><para>
                            Entfernt eine konkrete Autoloader Implementation vom internen Autoloader
                            Stack. Wenn ein Namespace oder mehrere Namespaces angegeben werden, wird
                            der Callback nur vom angegebenen Namespace oder den angegebenen
                            Namespaces entfernt.
                        </para></entry>
                    </row>
                </tbody>
            </tgroup>
        </table>
    </sect2>
</sect1>
