# Dynamiczne ładowanie plików i klas

Klasa `Zend_Loader` zawiera metody pomagające ci w dynamicznym ładowaniu plików.

## Zend_Loader a require_once()

Metody klasy `Zend_Loader` 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 `Zend_Loader` zamiast tradycyjnych funkcji PHP takich jak `require_once()`.

## Ładowanie plików

Statyczna metoda `Zend_Loader::loadFile()` ładuje plik PHP. Ładowany plik może zawierać dowolny kod PHP. Ta metoda używa funkcji PHP `include()`. Metoda ta wyrzuca wyjątek `Zend_Exception` w przypadku niepowodzenia, na przykład gdy dany plik nie istnieje.

### Przykład użycia metody loadFile()

    Zend_Loader::loadFile($filename, $dirs=null, $once=false);

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

Argument `$dirs` określa katalogi, które mają być sprawdzone w poszukiwaniu pliku. Jeśli ma wartość `NULL`, sprawdzane są jedynie ścieżki z dyrektywy `include_path`. 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 `include_path`.

Argument `$once` jest zmienną logiczną. Jeśli ma wartość `TRUE`, to metoda `Zend_Loader::loadFile()` używa do ładowania pliku funkcji PHP `include_once()`, w przeciwnym wypadku używa funkcji PHP `include()`.

## Ładowanie klas

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

### Przykład użycia metody loadClass()

    Zend_Loader::loadClass('Container_Tree',
        array(
            '/home/production/mylib',
            '/home/production/myapp'
        )
    );

Ł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'.

Jeśli argument `$dirs` jest łańcuchem znaków lub tablicą, metoda `Zend_Loader::loadClass()` 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 `$dirs`, to przeszukiwane są ścieżki z dyrektywy `include_path` środowiska PHP.

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

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

## Sprawdzanie czy plik jest dostępny do odczytu

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

### Przykład użycia metody isReadable()

    if (Zend_Loader::isReadable($filename)) {
        // zrób coś z $filename
    }

Argument `$filename` określa nazwę pliku do sprawdzenia. Może on zawierać informacje o ścieżce. Ta metoda używa funkcji PHP `is_readable()`. Funkcja PHP nie sprawdza ścieżek z dyrektywy `include_path`, a metoda `Zend_Loader::isReadable()` sprawdza.

## Użycie Autoloadera

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

### Przykład zarejestrowania metody autoloadera

Z powodu semantyki referencji do statycznych funkcji w PHP, musisz zaimplementować kod zarówno dla metody `loadClass()` jak i dla metody `autoload()`, a metoda `autoload()` musi wywołać metodę `self::loadClass()`. Jeśli twoja metoda `autoload()` odnosi się do klasy rodzica i wywołuje metodę `self::loadClass()`, wtedy wywołuje metodę o tej nazwie pochodzącą z klasy rodzica, a nie z klasy rozszerzonej.

    Zend_Loader::registerAutoload();

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 `autoload()` używa metody `Zend_Loader::loadClass()` automatycznie gdy odwołujesz się do klasy.

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

### Przykład rejestrowania metody autoloadera z rozszerzonej klasy

    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');

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