<sect1 id="zend.loader.load">

    <title>Dynamiczne ładowanie plików i klas</title>

    <para>
        Klasa <code>Zend_Loader</code> zawiera metody pomagające ci w dynamicznym ładowaniu
        plików.
    </para>

    <tip>
        <title>Zend_Loader a require_once()</title>
        <para>
            Metody klasy <code>Zend_Loader</code> są przydatne gdy nazwa pliku, który chcesz
            załadować jest zmienną. Na przykład, jeśli nazwa jest oparta na
            parametrze pochodzącym od użytkownika lub argumencie metody.
            Jeśli ładujesz plik lub klasę których nazwą jest stała, nie ma
            dodatkowych korzyści z użycia <code>Zend_Loader</code> zamiast tradycyjnych
            funkcji PHP takich jak
            <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
        </para>
    </tip>

    <sect2 id="zend.loader.load.file">

        <title>Ładowanie plików</title>

        <para>
            Statyczna metoda <code>Zend_Loader::loadFile()</code> ładuje plik
            PHP. Ładowany plik może zawierać dowolny kod PHP. Ta metoda używa
            funkcji PHP
            <ulink url="http://php.net/include"><code>include()</code></ulink>.
            Metoda ta wyrzuca wyjątek <code>Zend_Exception</code> w przypadku
            niepowodzenia, na przykład gdy dany plik nie istnieje.
        </para>

        <example id="zend.loader.load.file.example">
            <title>Przykład użycia metody loadFile()</title>
            <programlisting role="php"><![CDATA[
Zend_Loader::loadFile($filename, $dirs=null, $once=false);
]]>
            </programlisting>
    </example>

        <para>
            Argument <code>$filename</code> określa nazwę pliku do załadowania,
            nazwa ta nie może zawierać żadnych informacji o ścieżce.
            Parametr <code>$filename</code> jest sprawdzany pod kątem
            bezpieczeństwa. Argument <code>$filename</code> może zawierać
            jedynie znaki alfanumeryczne, myślniki ("-"), podkreślniki ("_"),
            oraz kropki ("."). Argument <code>$dirs</code> może być dowolny.
        </para>

        <para>
            Argument <code>$dirs</code> określa katalogi, które mają być
            sprawdzone w poszukiwaniu pliku. Jeśli ma wartość <code>NULL</code>,
            sprawdzane są jedynie ścieżki z dyrektywy <code>include_path</code>.
            Jeśli jest łańcuchem znaków lub tablicą, ścieżka lub ścieżki będą
            przeszukane, a następnie zostaną sprawdzone ścieżki z dyrektywy
            <code>include_path</code>.
        </para>

        <para>
            Argument <code>$once</code> jest zmienną logiczną. Jeśli ma wartość
            <code>TRUE</code>, to metoda <code>Zend_Loader::loadFile()</code>
            używa do ładowania pliku funkcji PHP
            <ulink url="http://php.net/include"><code>include_once()</code></ulink>,
            w przeciwnym wypadku używa funkcji PHP
            <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
        </para>

    </sect2>

    <sect2 id="zend.loader.load.class">

        <title>Ładowanie klas</title>

        <para>
            Statyczna metoda <code>Zend_Loader::loadClass($class, $dirs)</code>
            ładuje plik PHP, a następnie sprawdza czy dana klasa istnieje.
        </para>

        <example id="zend.loader.load.class.example">
            <title>Przykład użycia metody loadClass()</title>
            <programlisting role="php"><![CDATA[
Zend_Loader::loadClass('Container_Tree',
    array(
        '/home/production/mylib',
        '/home/production/myapp'
    )
);
]]>
            </programlisting>
        </example>

        <para>
            Łańcuch znaków określający nazwę klasy jest konwertowany do
            relatywnej ścieżki przez zamianę podkreślników na separatory ścieżek,
            oraz przez dodanie na końcu nazwy rozszerzenia '.php'. W powyższym
            przykładzie, nazwa 'Container_Tree' staje się 'Container\\Tree.php'.
        </para>

        <para>
            Jeśli argument <code>$dirs</code> jest łańcuchem znaków lub tablicą,
            metoda <code>Zend_Loader::loadClass()</code> przeszuka ścieżki w
            kolejności ich zdefiniowania. Pierwszy pasujący plik zostanie
            załadowany. Jeśli plik nie istnieje w ścieżkach ze zmiennej
            <code>$dirs</code>, to przeszukiwane są ścieżki z dyrektywy
            <code>include_path</code> środowiska PHP.
        </para>

        <para>
            Jeśli plik nie zostanie znaleziony lub po załadowaniu pliku klasa
            nie istnieje, metoda <code>Zend_Loader::loadClass()</code> wyrzuca
            wyjątek <code>Zend_Exception</code>.
        </para>

        <para>
            Do ładowania używana jest metoda <code>Zend_Loader::loadFile()</code>,
            więc nazwa klasy może zawierać jedynie znaki alfanumeryczne,
            myślniki ("-"), podkreślniki ("_"), oraz kropki (".").
        </para>

    </sect2>

    <sect2 id="zend.loader.load.isreadable">

        <title>Sprawdzanie czy plik jest dostępny do odczytu</title>

        <para>
            Statyczna metoda <code>Zend_Loader::isReadable($pathname)</code>
            zwraca <code>TRUE</code> jeśli plik w określonej ścieżce istnieje
            i jest dostępny do odczytu, w przeciwnym wypadku zwracana jest
            wartość <code>FALSE</code>.
        </para>

        <example id="zend.loader.load.isreadable.example">
            <title>Przykład użycia metody isReadable()</title>
            <programlisting role="php"><![CDATA[
if (Zend_Loader::isReadable($filename)) {
    // zrób coś z $filename
}
]]>
            </programlisting>
        </example>

        <para>
            Argument <code>$filename</code> określa nazwę pliku do sprawdzenia.
            Może on zawierać informacje o ścieżce. Ta metoda używa funkcji PHP
            <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
            Funkcja PHP nie sprawdza ścieżek z dyrektywy <code>include_path</code>,
            a metoda <code>Zend_Loader::isReadable()</code> sprawdza.
        </para>

    </sect2>

    <sect2 id="zend.loader.load.autoload">

        <title>Użycie Autoloadera</title>

        <para>
            Klasa <code>Zend_Loader</code> zawiera metodę, którą możesz zarejestrować jako
            autoloader PHP SPL. Tą metodą jest <code>Zend_Loader::autoload()</code>.
            Dla wygody klasa <code>Zend_Loader</code> posiada metodę
            <code>registerAutoload()</code> rejestrującą swoją własną metodę
            <code>autoload()</code>. Jeśli rozszerzenie <code>spl_autoload</code>
            nie jest zainstalowane w środowisku PHP, to metoda
            <code>registerAutoload()</code> wyrzuca wyjątek <code>Zend_Exception</code>.

        </para>

        <example id="zend.loader.load.autoload.example-extended">
            <title>Przykład zarejestrowania metody autoloadera</title>
            <para>
                Z powodu semantyki referencji do statycznych funkcji w PHP,
                musisz zaimplementować kod zarówno dla metody <code>loadClass()</code>
                jak i dla metody <code>autoload()</code>, a metoda <code>autoload()</code>
                musi wywołać metodę <code>self::loadClass()</code>.
                Jeśli twoja metoda <code>autoload()</code> odnosi się do klasy
                rodzica i wywołuje metodę <code>self::loadClass()</code>, wtedy
                wywołuje metodę o tej nazwie pochodzącą z klasy rodzica, a nie
                z klasy rozszerzonej.
            </para>
            <programlisting role="php"><![CDATA[
Zend_Loader::registerAutoload();
]]>
            </programlisting>
        </example>

        <para>
            Po zarejestrowaniu metody autoload z Zend Framework, możesz
            odwoływać się do klas Zend Framework bez konieczności ładowania
            każdej z nich z osobna. Metoda <code>autoload()</code> używa metody
            <code>Zend_Loader::loadClass()</code> automatycznie gdy odwołujesz
            się do klasy.
        </para>

        <para>
            Jeśli rozszerzyłeś klasę <code>Zend_Loader</code>, możesz przekazać opcjonalny
            argument do metody <code>registerAutoload()</code>, aby określić
            klasę, której metoda <code>autoload()</code> ma zostać zarejestrowana.
        </para>

        <example id="zend.loader.load.autoload.example">
            <title>Przykład rejestrowania metody autoloadera z rozszerzonej
                klasy</title>
            <programlisting role="php"><![CDATA[
class My_Loader extends Zend_Loader
{
    public static function loadClass($class, $dirs = null)
    {
        parent::loadClass($class, $dirs);
    }

    public static function autoload($class)
    {
        try {
            self::loadClass($class);
            return $class;
        } catch (Exception $e) {
            return false;
        }
    }
}

Zend_Loader::registerAutoload('My_Loader');
]]>
            </programlisting>
        </example>

        <para>
            Możesz usunąć metodą autoloadera. Metoda
            <code>registerAutoload()</code> przyjmuje opcjonalny drugi argument,
            ktorego wartością domyślna jest <code>true</code>. Jeśli ten argument
            ma wartość <code>false</code>, metoda autoloadera zostanie
            wyrejestrowana ze stosu autoloaderów SPL.
        </para>

    </sect2>

</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
