Rozdział 17. Zend_Loader

Spis treści

17.1. Dynamiczne ładowanie plików i klas
17.1.1. Ładowanie plików
17.1.2. Ładowanie klas
17.1.3. Sprawdzanie czy plik jest dostępny do odczytu
17.1.4. Użycie Autoloadera

17.1. Dynamiczne ładowanie plików i klas

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

[Podpowiedź] 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().

17.1.1. Ł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 17.1. Przykład użycia metody loadFile()

<?php

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().

17.1.2. Ładowanie klas

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

Przykład 17.2. Przykład użycia metody loadClass()

<?php

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 (".").

17.1.3. 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 17.3. Przykład użycia metody isReadable()

<?php

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.

17.1.4. 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 17.4. Przykład zarejestrowania metody autoloadera

<?php

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 17.5. Przykład rejestrowania metody autoloadera z rozszerzonej klasy

<?php

class My_Loader extends Zend_Loader
{
    // własna funkcjonalność
}

Zend_Loader::registerAutoload('My_Loader');

?>