<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.autoloading.design">
    <title>Cele i budowa</title>

    <sect2 id="learning.autoloading.design.naming">
        <title>Konwencja nazewnictwa klas</title>

        <para>
            Aby zrozumieć autoloader w Zend Framework, należy najpierw zrozumieć połączenie
            pomiędzy nazwami klas a ich plikami. 
        </para>

        <para>
            Budując Zend Framework zapożyczono ideę organizacji klas z biblioteki
            <ulink url="http://pear.php.net/">PEAR</ulink>. Według niej relacja klas do plików
            wynosi 1:1. W skrócie: aby odnaleźć ścieżkę do odpowiedniego pliku
            znak podkreślenia ("_") w nazwach klas jest zastępowany znakiem oddzielenia katalogu
            a następnie dodawane jest rozszerzenie "<filename>.php</filename>". Przykładowo,
            klasa "<classname>Foo_Bar_Baz</classname>" odpowiadałaby ścieżce dostępu
            "<filename>Foo/Bar/Baz.php</filename>". Dodatkowo respektowane są ustawienia
            zmiennej konfiguracyjnej <acronym>PHP</acronym> - <property>include_path</property>,
            dzięki czemu możliwe jest użycie <methodname>include()</methodname> oraz
            <methodname>require()</methodname> i wyszukanie pliku wg. ścieżki względnej do katalogów
            w <property>include_path</property>.
        </para>

        <para>
            Dodatkowo, podobnie jak <acronym>PEAR</acronym> oraz
            <ulink url="http://php.net/userlandnaming.tips">projekt PHP</ulink> praktykowane i
            zalecane jest użycie w kodzie prefiksów charakterystycznych dla projektu lub producenta.
            To oznacza, że wszystkie klasy powinny dzielić jeden wspólny prefiks. Przykładowo,
            wszystkie klasy w Zend Framework mają prefiks "Zend_". Taka konwencja chroni
            przed kolizjami nazw. W ramach Zend Framework przybiera to nazwę prefiksu przestrzeni
            nazw. Należy zachować ostrożność aby nie pomylić tego z natywną obsługą przestrzeni
            nazw w <acronym>PHP</acronym>.
        </para>

        <para>
            Zend Framework podąża za tymi wskazówkami wewnętrznie ale nasze standardy zachęcają 
            do ich stosowania także w kodzie aplikacji, innych bibliotek itp.
        </para>
    </sect2>

    <sect2 id="learning.autoloading.design.autoloader">
        <title>Konwencja nazewnictwa i budowa autoloadera</title>

        <para>
            Obsługa autoloadera w Zend Framework udostępniona głównie poprzez
            <classname>Zend_Loader_Autoloader</classname> charakteryzuje się poniższymi celami
            i elementami budowy:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Zapewnia przeszukiwanie przestrzeni nazw</emphasis>.
                    Jeśli prefiks przestrzeni nazw klasy nie znajduje się na liście zarejestrowanych
                    przestrzeni - od razu zwracana jest wartość <constant>FALSE</constant>.
                    Dzięki temu może nastąpić szybsze przełączenie do ewentualnego kolejnego
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Umożliwienie działania autoloadera jako ostatniej instancji</emphasis>.
                    W przypadku, gdy zespół programistów jest w dużym stopniu rozproszony lub
                    lista respektowanych prefiksów przestrzeni nazw jest zmienna, autoloader
                    powinien zachować swoją funkcjonalność w taki sposób, żeby możliwe było
                    użycie każdego prefiksu przestrzeni nazw. Trzeba zwrócić uwagę na fakt, iż
                    takie zachowanie nie jest zalecane i może prowadzić do 
                    niepotrzebnego wydłużenia procesu wyszukania pliku.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Umożliwienie włączaniania i wyłączania raportowania błędów</emphasis>.
                    Twórcy ZF - jak i większa część społeczności <acronym>PHP</acronym> - uważają,
                    że zapobieganie raportowaniu błędów jest złym pomysłem. Jest kosztowne i
                    powoduje ukrycie realnych problemów aplikacji. Domyślnie opcja ta powinna być
                    wyłączona ale jeśli deweloper <emphasis>chce</emphasis> ją włączyć to jest to
                    umożliwione.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Umożliwienie skonfigurowania własnych funkcji oferujących 
                    funkcjonalność autoloadera</emphasis>.
                    Część deweloperów nie będzie chciała używać
                    <methodname>Zend_Loader::loadClass()</methodname> jednocześnie nie rezygnując
                    z mechanizmów Zend Framework.
                    Klasa <classname>Zend_Loader_Autoloader</classname> umożliwia wyszczególnienie
                    alternatywnej funkcji oferującej taką samą funkcjonalność.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Umożliwienie manipulacji łańcuchem funkcji autoload w
                    <acronym>SPL</acronym></emphasis>.
                    Celem tego założenia jest pozwolenie na określenie przez dewelopera dodatkowych
                    funkcji oferujących funkcjonalność autoloadera - np. dla funkcje ładujące
                    zasoby dla klas, które nie mają relacji 1:1 z plikami - aby były zarejestrowane
                    przed lub po domyślnym mechanizmie autoloadera Zend Framework. 
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>
