Klasa Zend_Loader zawiera metody pomagające ci w dynamicznym ładowaniu
plików.
![]() |
Zend_Loader a require_once() |
|---|---|
Metody klasy |
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 25.1. 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().
Statyczna metoda Zend_Loader::loadClass($class, $dirs)
ładuje plik PHP, a następnie sprawdza czy dana klasa istnieje.
Przykład 25.2. 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 (".").
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 25.3. 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.
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 25.4. 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 25.5. 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.