1 <sect1 id="zend.loader.load">
3 <title>Dynamiczne ładowanie plików i klas</title>
6 Klasa <code>Zend_Loader</code> zawiera metody pomagające ci w dynamicznym ładowaniu
11 <title>Zend_Loader a require_once()</title>
13 Metody klasy <code>Zend_Loader</code> są przydatne gdy nazwa pliku, który chcesz
14 załadować jest zmienną. Na przykład, jeśli nazwa jest oparta na
15 parametrze pochodzącym od użytkownika lub argumencie metody.
16 Jeśli ładujesz plik lub klasę których nazwą jest stała, nie ma
17 dodatkowych korzyści z użycia <code>Zend_Loader</code> zamiast tradycyjnych
18 funkcji PHP takich jak
19 <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
23 <sect2 id="zend.loader.load.file">
25 <title>Ładowanie plików</title>
28 Statyczna metoda <code>Zend_Loader::loadFile()</code> ładuje plik
29 PHP. Ładowany plik może zawierać dowolny kod PHP. Ta metoda używa
31 <ulink url="http://php.net/include"><code>include()</code></ulink>.
32 Metoda ta wyrzuca wyjątek <code>Zend_Exception</code> w przypadku
33 niepowodzenia, na przykład gdy dany plik nie istnieje.
36 <example id="zend.loader.load.file.example">
37 <title>Przykład użycia metody loadFile()</title>
38 <programlisting role="php"><![CDATA[
39 Zend_Loader::loadFile($filename, $dirs=null, $once=false);
45 Argument <code>$filename</code> określa nazwę pliku do załadowania,
46 nazwa ta nie może zawierać żadnych informacji o ścieżce.
47 Parametr <code>$filename</code> jest sprawdzany pod kątem
48 bezpieczeństwa. Argument <code>$filename</code> może zawierać
49 jedynie znaki alfanumeryczne, myślniki ("-"), podkreślniki ("_"),
50 oraz kropki ("."). Argument <code>$dirs</code> może być dowolny.
54 Argument <code>$dirs</code> określa katalogi, które mają być
55 sprawdzone w poszukiwaniu pliku. Jeśli ma wartość <code>NULL</code>,
56 sprawdzane są jedynie ścieżki z dyrektywy <code>include_path</code>.
57 Jeśli jest łańcuchem znaków lub tablicą, ścieżka lub ścieżki będą
58 przeszukane, a następnie zostaną sprawdzone ścieżki z dyrektywy
59 <code>include_path</code>.
63 Argument <code>$once</code> jest zmienną logiczną. Jeśli ma wartość
64 <code>TRUE</code>, to metoda <code>Zend_Loader::loadFile()</code>
65 używa do ładowania pliku funkcji PHP
66 <ulink url="http://php.net/include"><code>include_once()</code></ulink>,
67 w przeciwnym wypadku używa funkcji PHP
68 <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
73 <sect2 id="zend.loader.load.class">
75 <title>Ładowanie klas</title>
78 Statyczna metoda <code>Zend_Loader::loadClass($class, $dirs)</code>
79 ładuje plik PHP, a następnie sprawdza czy dana klasa istnieje.
82 <example id="zend.loader.load.class.example">
83 <title>Przykład użycia metody loadClass()</title>
84 <programlisting role="php"><![CDATA[
85 Zend_Loader::loadClass('Container_Tree',
87 '/home/production/mylib',
88 '/home/production/myapp'
96 Łańcuch znaków określający nazwę klasy jest konwertowany do
97 relatywnej ścieżki przez zamianę podkreślników na separatory ścieżek,
98 oraz przez dodanie na końcu nazwy rozszerzenia '.php'. W powyższym
99 przykładzie, nazwa 'Container_Tree' staje się 'Container\\Tree.php'.
103 Jeśli argument <code>$dirs</code> jest łańcuchem znaków lub tablicą,
104 metoda <code>Zend_Loader::loadClass()</code> przeszuka ścieżki w
105 kolejności ich zdefiniowania. Pierwszy pasujący plik zostanie
106 załadowany. Jeśli plik nie istnieje w ścieżkach ze zmiennej
107 <code>$dirs</code>, to przeszukiwane są ścieżki z dyrektywy
108 <code>include_path</code> środowiska PHP.
112 Jeśli plik nie zostanie znaleziony lub po załadowaniu pliku klasa
113 nie istnieje, metoda <code>Zend_Loader::loadClass()</code> wyrzuca
114 wyjątek <code>Zend_Exception</code>.
118 Do ładowania używana jest metoda <code>Zend_Loader::loadFile()</code>,
119 więc nazwa klasy może zawierać jedynie znaki alfanumeryczne,
120 myślniki ("-"), podkreślniki ("_"), oraz kropki (".").
125 <sect2 id="zend.loader.load.isreadable">
127 <title>Sprawdzanie czy plik jest dostępny do odczytu</title>
130 Statyczna metoda <code>Zend_Loader::isReadable($pathname)</code>
131 zwraca <code>TRUE</code> jeśli plik w określonej ścieżce istnieje
132 i jest dostępny do odczytu, w przeciwnym wypadku zwracana jest
133 wartość <code>FALSE</code>.
136 <example id="zend.loader.load.isreadable.example">
137 <title>Przykład użycia metody isReadable()</title>
138 <programlisting role="php"><![CDATA[
139 if (Zend_Loader::isReadable($filename)) {
140 // zrób coś z $filename
147 Argument <code>$filename</code> określa nazwę pliku do sprawdzenia.
148 Może on zawierać informacje o ścieżce. Ta metoda używa funkcji PHP
149 <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
150 Funkcja PHP nie sprawdza ścieżek z dyrektywy <code>include_path</code>,
151 a metoda <code>Zend_Loader::isReadable()</code> sprawdza.
156 <sect2 id="zend.loader.load.autoload">
158 <title>Użycie Autoloadera</title>
161 Klasa <code>Zend_Loader</code> zawiera metodę, którą możesz zarejestrować jako
162 autoloader PHP SPL. Tą metodą jest <code>Zend_Loader::autoload()</code>.
163 Dla wygody klasa <code>Zend_Loader</code> posiada metodę
164 <code>registerAutoload()</code> rejestrującą swoją własną metodę
165 <code>autoload()</code>. Jeśli rozszerzenie <code>spl_autoload</code>
166 nie jest zainstalowane w środowisku PHP, to metoda
167 <code>registerAutoload()</code> wyrzuca wyjątek <code>Zend_Exception</code>.
171 <example id="zend.loader.load.autoload.example-extended">
172 <title>Przykład zarejestrowania metody autoloadera</title>
174 Z powodu semantyki referencji do statycznych funkcji w PHP,
175 musisz zaimplementować kod zarówno dla metody <code>loadClass()</code>
176 jak i dla metody <code>autoload()</code>, a metoda <code>autoload()</code>
177 musi wywołać metodę <code>self::loadClass()</code>.
178 Jeśli twoja metoda <code>autoload()</code> odnosi się do klasy
179 rodzica i wywołuje metodę <code>self::loadClass()</code>, wtedy
180 wywołuje metodę o tej nazwie pochodzącą z klasy rodzica, a nie
181 z klasy rozszerzonej.
183 <programlisting role="php"><![CDATA[
184 Zend_Loader::registerAutoload();
190 Po zarejestrowaniu metody autoload z Zend Framework, możesz
191 odwoływać się do klas Zend Framework bez konieczności ładowania
192 każdej z nich z osobna. Metoda <code>autoload()</code> używa metody
193 <code>Zend_Loader::loadClass()</code> automatycznie gdy odwołujesz
198 Jeśli rozszerzyłeś klasę <code>Zend_Loader</code>, możesz przekazać opcjonalny
199 argument do metody <code>registerAutoload()</code>, aby określić
200 klasę, której metoda <code>autoload()</code> ma zostać zarejestrowana.
203 <example id="zend.loader.load.autoload.example">
204 <title>Przykład rejestrowania metody autoloadera z rozszerzonej
206 <programlisting role="php"><![CDATA[
207 class My_Loader extends Zend_Loader
209 public static function loadClass($class, $dirs = null)
211 parent::loadClass($class, $dirs);
214 public static function autoload($class)
217 self::loadClass($class);
219 } catch (Exception $e) {
225 Zend_Loader::registerAutoload('My_Loader');
231 Możesz usunąć metodą autoloadera. Metoda
232 <code>registerAutoload()</code> przyjmuje opcjonalny drugi argument,
233 ktorego wartością domyślna jest <code>true</code>. Jeśli ten argument
234 ma wartość <code>false</code>, metoda autoloadera zostanie
235 wyrejestrowana ze stosu autoloaderów SPL.