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()
.
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 510. 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 511. 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 512. 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 513. 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 514. 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.