Zend_Loader.xml 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <sect1 id="zend.loader.load">
  2. <title>Dynamiczne ładowanie plików i klas</title>
  3. <para>
  4. Klasa <code>Zend_Loader</code> zawiera metody pomagające ci w dynamicznym ładowaniu
  5. plików.
  6. </para>
  7. <tip>
  8. <title>Zend_Loader a require_once()</title>
  9. <para>
  10. Metody klasy <code>Zend_Loader</code> są przydatne gdy nazwa pliku, który chcesz
  11. załadować jest zmienną. Na przykład, jeśli nazwa jest oparta na
  12. parametrze pochodzącym od użytkownika lub argumencie metody.
  13. Jeśli ładujesz plik lub klasę których nazwą jest stała, nie ma
  14. dodatkowych korzyści z użycia <code>Zend_Loader</code> zamiast tradycyjnych
  15. funkcji PHP takich jak
  16. <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>.
  17. </para>
  18. </tip>
  19. <sect2 id="zend.loader.load.file">
  20. <title>Ładowanie plików</title>
  21. <para>
  22. Statyczna metoda <code>Zend_Loader::loadFile()</code> ładuje plik
  23. PHP. Ładowany plik może zawierać dowolny kod PHP. Ta metoda używa
  24. funkcji PHP
  25. <ulink url="http://php.net/include"><code>include()</code></ulink>.
  26. Metoda ta wyrzuca wyjątek <code>Zend_Exception</code> w przypadku
  27. niepowodzenia, na przykład gdy dany plik nie istnieje.
  28. </para>
  29. <example id="zend.loader.load.file.example">
  30. <title>Przykład użycia metody loadFile()</title>
  31. <programlisting role="php"><![CDATA[
  32. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  33. ]]>
  34. </programlisting>
  35. </example>
  36. <para>
  37. Argument <code>$filename</code> określa nazwę pliku do załadowania,
  38. nazwa ta nie może zawierać żadnych informacji o ścieżce.
  39. Parametr <code>$filename</code> jest sprawdzany pod kątem
  40. bezpieczeństwa. Argument <code>$filename</code> może zawierać
  41. jedynie znaki alfanumeryczne, myślniki ("-"), podkreślniki ("_"),
  42. oraz kropki ("."). Argument <code>$dirs</code> może być dowolny.
  43. </para>
  44. <para>
  45. Argument <code>$dirs</code> określa katalogi, które mają być
  46. sprawdzone w poszukiwaniu pliku. Jeśli ma wartość <code>NULL</code>,
  47. sprawdzane są jedynie ścieżki z dyrektywy <code>include_path</code>.
  48. Jeśli jest łańcuchem znaków lub tablicą, ścieżka lub ścieżki będą
  49. przeszukane, a następnie zostaną sprawdzone ścieżki z dyrektywy
  50. <code>include_path</code>.
  51. </para>
  52. <para>
  53. Argument <code>$once</code> jest zmienną logiczną. Jeśli ma wartość
  54. <code>TRUE</code>, to metoda <code>Zend_Loader::loadFile()</code>
  55. używa do ładowania pliku funkcji PHP
  56. <ulink url="http://php.net/include"><code>include_once()</code></ulink>,
  57. w przeciwnym wypadku używa funkcji PHP
  58. <ulink url="http://php.net/include_once"><code>include()</code></ulink>.
  59. </para>
  60. </sect2>
  61. <sect2 id="zend.loader.load.class">
  62. <title>Ładowanie klas</title>
  63. <para>
  64. Statyczna metoda <code>Zend_Loader::loadClass($class, $dirs)</code>
  65. ładuje plik PHP, a następnie sprawdza czy dana klasa istnieje.
  66. </para>
  67. <example id="zend.loader.load.class.example">
  68. <title>Przykład użycia metody loadClass()</title>
  69. <programlisting role="php"><![CDATA[
  70. Zend_Loader::loadClass('Container_Tree',
  71. array(
  72. '/home/production/mylib',
  73. '/home/production/myapp'
  74. )
  75. );
  76. ]]>
  77. </programlisting>
  78. </example>
  79. <para>
  80. Łańcuch znaków określający nazwę klasy jest konwertowany do
  81. relatywnej ścieżki przez zamianę podkreślników na separatory ścieżek,
  82. oraz przez dodanie na końcu nazwy rozszerzenia '.php'. W powyższym
  83. przykładzie, nazwa 'Container_Tree' staje się 'Container\\Tree.php'.
  84. </para>
  85. <para>
  86. Jeśli argument <code>$dirs</code> jest łańcuchem znaków lub tablicą,
  87. metoda <code>Zend_Loader::loadClass()</code> przeszuka ścieżki w
  88. kolejności ich zdefiniowania. Pierwszy pasujący plik zostanie
  89. załadowany. Jeśli plik nie istnieje w ścieżkach ze zmiennej
  90. <code>$dirs</code>, to przeszukiwane są ścieżki z dyrektywy
  91. <code>include_path</code> środowiska PHP.
  92. </para>
  93. <para>
  94. Jeśli plik nie zostanie znaleziony lub po załadowaniu pliku klasa
  95. nie istnieje, metoda <code>Zend_Loader::loadClass()</code> wyrzuca
  96. wyjątek <code>Zend_Exception</code>.
  97. </para>
  98. <para>
  99. Do ładowania używana jest metoda <code>Zend_Loader::loadFile()</code>,
  100. więc nazwa klasy może zawierać jedynie znaki alfanumeryczne,
  101. myślniki ("-"), podkreślniki ("_"), oraz kropki (".").
  102. </para>
  103. </sect2>
  104. <sect2 id="zend.loader.load.isreadable">
  105. <title>Sprawdzanie czy plik jest dostępny do odczytu</title>
  106. <para>
  107. Statyczna metoda <code>Zend_Loader::isReadable($pathname)</code>
  108. zwraca <code>TRUE</code> jeśli plik w określonej ścieżce istnieje
  109. i jest dostępny do odczytu, w przeciwnym wypadku zwracana jest
  110. wartość <code>FALSE</code>.
  111. </para>
  112. <example id="zend.loader.load.isreadable.example">
  113. <title>Przykład użycia metody isReadable()</title>
  114. <programlisting role="php"><![CDATA[
  115. if (Zend_Loader::isReadable($filename)) {
  116. // zrób coś z $filename
  117. }
  118. ]]>
  119. </programlisting>
  120. </example>
  121. <para>
  122. Argument <code>$filename</code> określa nazwę pliku do sprawdzenia.
  123. Może on zawierać informacje o ścieżce. Ta metoda używa funkcji PHP
  124. <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>.
  125. Funkcja PHP nie sprawdza ścieżek z dyrektywy <code>include_path</code>,
  126. a metoda <code>Zend_Loader::isReadable()</code> sprawdza.
  127. </para>
  128. </sect2>
  129. <sect2 id="zend.loader.load.autoload">
  130. <title>Użycie Autoloadera</title>
  131. <para>
  132. Klasa <code>Zend_Loader</code> zawiera metodę, którą możesz zarejestrować jako
  133. autoloader PHP SPL. Tą metodą jest <code>Zend_Loader::autoload()</code>.
  134. Dla wygody klasa <code>Zend_Loader</code> posiada metodę
  135. <code>registerAutoload()</code> rejestrującą swoją własną metodę
  136. <code>autoload()</code>. Jeśli rozszerzenie <code>spl_autoload</code>
  137. nie jest zainstalowane w środowisku PHP, to metoda
  138. <code>registerAutoload()</code> wyrzuca wyjątek <code>Zend_Exception</code>.
  139. </para>
  140. <example id="zend.loader.load.autoload.example-extended">
  141. <title>Przykład zarejestrowania metody autoloadera</title>
  142. <para>
  143. Z powodu semantyki referencji do statycznych funkcji w PHP,
  144. musisz zaimplementować kod zarówno dla metody <code>loadClass()</code>
  145. jak i dla metody <code>autoload()</code>, a metoda <code>autoload()</code>
  146. musi wywołać metodę <code>self::loadClass()</code>.
  147. Jeśli twoja metoda <code>autoload()</code> odnosi się do klasy
  148. rodzica i wywołuje metodę <code>self::loadClass()</code>, wtedy
  149. wywołuje metodę o tej nazwie pochodzącą z klasy rodzica, a nie
  150. z klasy rozszerzonej.
  151. </para>
  152. <programlisting role="php"><![CDATA[
  153. Zend_Loader::registerAutoload();
  154. ]]>
  155. </programlisting>
  156. </example>
  157. <para>
  158. Po zarejestrowaniu metody autoload z Zend Framework, możesz
  159. odwoływać się do klas Zend Framework bez konieczności ładowania
  160. każdej z nich z osobna. Metoda <code>autoload()</code> używa metody
  161. <code>Zend_Loader::loadClass()</code> automatycznie gdy odwołujesz
  162. się do klasy.
  163. </para>
  164. <para>
  165. Jeśli rozszerzyłeś klasę <code>Zend_Loader</code>, możesz przekazać opcjonalny
  166. argument do metody <code>registerAutoload()</code>, aby określić
  167. klasę, której metoda <code>autoload()</code> ma zostać zarejestrowana.
  168. </para>
  169. <example id="zend.loader.load.autoload.example">
  170. <title>Przykład rejestrowania metody autoloadera z rozszerzonej
  171. klasy</title>
  172. <programlisting role="php"><![CDATA[
  173. class My_Loader extends Zend_Loader
  174. {
  175. public static function loadClass($class, $dirs = null)
  176. {
  177. parent::loadClass($class, $dirs);
  178. }
  179. public static function autoload($class)
  180. {
  181. try {
  182. self::loadClass($class);
  183. return $class;
  184. } catch (Exception $e) {
  185. return false;
  186. }
  187. }
  188. }
  189. Zend_Loader::registerAutoload('My_Loader');
  190. ]]>
  191. </programlisting>
  192. </example>
  193. <para>
  194. Możesz usunąć metodą autoloadera. Metoda
  195. <code>registerAutoload()</code> przyjmuje opcjonalny drugi argument,
  196. ktorego wartością domyślna jest <code>true</code>. Jeśli ten argument
  197. ma wartość <code>false</code>, metoda autoloadera zostanie
  198. wyrejestrowana ze stosu autoloaderów SPL.
  199. </para>
  200. </sect2>
  201. </sect1>
  202. <!--
  203. vim:se ts=4 sw=4 et:
  204. -->