| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <sect1 id="zend.loader.load">
- <title>Dynamiczne ładowanie plików i klas</title>
- <para>
- Klasa <code>Zend_Loader</code> zawiera metody pomagające ci w dynamicznym ładowaniu
- plików.
- </para>
- <tip>
- <title>Zend_Loader a require_once()</title>
- <para>
- Metody klasy <code>Zend_Loader</code> 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 <code>Zend_Loader</code> zamiast tradycyjnych
- funkcji PHP takich jak
- <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
- </para>
- </tip>
- <sect2 id="zend.loader.load.file">
- <title>Ładowanie plików</title>
- <para>
- Statyczna metoda <code>Zend_Loader::loadFile()</code> ładuje plik
- PHP. Ładowany plik może zawierać dowolny kod PHP. Ta metoda używa
- funkcji PHP
- <ulink url="http://php.net/include"><code>include()</code></ulink>.
- Metoda ta wyrzuca wyjątek <code>Zend_Exception</code> w przypadku
- niepowodzenia, na przykład gdy dany plik nie istnieje.
- </para>
- <example id="zend.loader.load.file.example">
- <title>Przykład użycia metody loadFile()</title>
- <programlisting role="php"><![CDATA[
- Zend_Loader::loadFile($filename, $dirs=null, $once=false);
- ]]>
- </programlisting>
- </example>
- <para>
- Argument <code>$filename</code> określa nazwę pliku do załadowania,
- nazwa ta nie może zawierać żadnych informacji o ścieżce.
- Parametr <code>$filename</code> jest sprawdzany pod kątem
- bezpieczeństwa. Argument <code>$filename</code> może zawierać
- jedynie znaki alfanumeryczne, myślniki ("-"), podkreślniki ("_"),
- oraz kropki ("."). Argument <code>$dirs</code> może być dowolny.
- </para>
- <para>
- Argument <code>$dirs</code> określa katalogi, które mają być
- sprawdzone w poszukiwaniu pliku. Jeśli ma wartość <code>NULL</code>,
- sprawdzane są jedynie ścieżki z dyrektywy <code>include_path</code>.
- 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
- <code>include_path</code>.
- </para>
- <para>
- Argument <code>$once</code> jest zmienną logiczną. Jeśli ma wartość
- <code>TRUE</code>, to metoda <code>Zend_Loader::loadFile()</code>
- używa do ładowania pliku funkcji PHP
- <ulink url="http://php.net/include"><code>include_once()</code></ulink>,
- w przeciwnym wypadku używa funkcji PHP
- <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
- </para>
- </sect2>
- <sect2 id="zend.loader.load.class">
- <title>Ładowanie klas</title>
- <para>
- Statyczna metoda <code>Zend_Loader::loadClass($class, $dirs)</code>
- ładuje plik PHP, a następnie sprawdza czy dana klasa istnieje.
- </para>
- <example id="zend.loader.load.class.example">
- <title>Przykład użycia metody loadClass()</title>
- <programlisting role="php"><![CDATA[
- Zend_Loader::loadClass('Container_Tree',
- array(
- '/home/production/mylib',
- '/home/production/myapp'
- )
- );
- ]]>
- </programlisting>
- </example>
- <para>
- Ł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'.
- </para>
- <para>
- Jeśli argument <code>$dirs</code> jest łańcuchem znaków lub tablicą,
- metoda <code>Zend_Loader::loadClass()</code> 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
- <code>$dirs</code>, to przeszukiwane są ścieżki z dyrektywy
- <code>include_path</code> środowiska PHP.
- </para>
- <para>
- Jeśli plik nie zostanie znaleziony lub po załadowaniu pliku klasa
- nie istnieje, metoda <code>Zend_Loader::loadClass()</code> wyrzuca
- wyjątek <code>Zend_Exception</code>.
- </para>
- <para>
- Do ładowania używana jest metoda <code>Zend_Loader::loadFile()</code>,
- więc nazwa klasy może zawierać jedynie znaki alfanumeryczne,
- myślniki ("-"), podkreślniki ("_"), oraz kropki (".").
- </para>
- </sect2>
- <sect2 id="zend.loader.load.isreadable">
- <title>Sprawdzanie czy plik jest dostępny do odczytu</title>
- <para>
- Statyczna metoda <code>Zend_Loader::isReadable($pathname)</code>
- zwraca <code>TRUE</code> jeśli plik w określonej ścieżce istnieje
- i jest dostępny do odczytu, w przeciwnym wypadku zwracana jest
- wartość <code>FALSE</code>.
- </para>
- <example id="zend.loader.load.isreadable.example">
- <title>Przykład użycia metody isReadable()</title>
- <programlisting role="php"><![CDATA[
- if (Zend_Loader::isReadable($filename)) {
- // zrób coś z $filename
- }
- ]]>
- </programlisting>
- </example>
- <para>
- Argument <code>$filename</code> określa nazwę pliku do sprawdzenia.
- Może on zawierać informacje o ścieżce. Ta metoda używa funkcji PHP
- <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
- Funkcja PHP nie sprawdza ścieżek z dyrektywy <code>include_path</code>,
- a metoda <code>Zend_Loader::isReadable()</code> sprawdza.
- </para>
- </sect2>
- <sect2 id="zend.loader.load.autoload">
- <title>Użycie Autoloadera</title>
- <para>
- Klasa <code>Zend_Loader</code> zawiera metodę, którą możesz zarejestrować jako
- autoloader PHP SPL. Tą metodą jest <code>Zend_Loader::autoload()</code>.
- Dla wygody klasa <code>Zend_Loader</code> posiada metodę
- <code>registerAutoload()</code> rejestrującą swoją własną metodę
- <code>autoload()</code>. Jeśli rozszerzenie <code>spl_autoload</code>
- nie jest zainstalowane w środowisku PHP, to metoda
- <code>registerAutoload()</code> wyrzuca wyjątek <code>Zend_Exception</code>.
- </para>
- <example id="zend.loader.load.autoload.example-extended">
- <title>Przykład zarejestrowania metody autoloadera</title>
- <para>
- Z powodu semantyki referencji do statycznych funkcji w PHP,
- musisz zaimplementować kod zarówno dla metody <code>loadClass()</code>
- jak i dla metody <code>autoload()</code>, a metoda <code>autoload()</code>
- musi wywołać metodę <code>self::loadClass()</code>.
- Jeśli twoja metoda <code>autoload()</code> odnosi się do klasy
- rodzica i wywołuje metodę <code>self::loadClass()</code>, wtedy
- wywołuje metodę o tej nazwie pochodzącą z klasy rodzica, a nie
- z klasy rozszerzonej.
- </para>
- <programlisting role="php"><![CDATA[
- Zend_Loader::registerAutoload();
- ]]>
- </programlisting>
- </example>
- <para>
- 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 <code>autoload()</code> używa metody
- <code>Zend_Loader::loadClass()</code> automatycznie gdy odwołujesz
- się do klasy.
- </para>
- <para>
- Jeśli rozszerzyłeś klasę <code>Zend_Loader</code>, możesz przekazać opcjonalny
- argument do metody <code>registerAutoload()</code>, aby określić
- klasę, której metoda <code>autoload()</code> ma zostać zarejestrowana.
- </para>
- <example id="zend.loader.load.autoload.example">
- <title>Przykład rejestrowania metody autoloadera z rozszerzonej
- klasy</title>
- <programlisting role="php"><![CDATA[
- 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');
- ]]>
- </programlisting>
- </example>
- <para>
- Możesz usunąć metodą autoloadera. Metoda
- <code>registerAutoload()</code> przyjmuje opcjonalny drugi argument,
- ktorego wartością domyślna jest <code>true</code>. Jeśli ten argument
- ma wartość <code>false</code>, metoda autoloadera zostanie
- wyrejestrowana ze stosu autoloaderów SPL.
- </para>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|