Zend_Loader.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 15103 -->
  4. <sect1 id="zend.loader.load">
  5. <title>ファイルやクラスの動的な読み込み</title>
  6. <para>
  7. Zend_Loader クラスは、ファイルを動的に読み込むためのメソッドを提供します。
  8. </para>
  9. <tip>
  10. <title>Zend_Loader 対 require_once()</title>
  11. <para>
  12. <classname>Zend_Loader</classname> のメソッドは、読み込みたいファイルの名前が変化する場合に便利です。
  13. たとえば、ユーザの入力やメソッドの引数などのパラメータに基づいたファイル名を使用する場合などです。
  14. もし読み込むファイルやクラスの名前が決まっている場合は、
  15. <ulink url="http://php.net/require_once"><code>require_once()</code></ulink>
  16. のような PHP の関数ではなくあえて <classname>Zend_Loader</classname> を使用するメリットはありません。
  17. </para>
  18. </tip>
  19. <sect2 id="zend.loader.load.file">
  20. <title>ファイルの読み込み</title>
  21. <para>
  22. 静的メソッド <classname>Zend_Loader::loadFile()</classname>
  23. は、PHP ファイルを読み込みます。
  24. 読み込まれるファイルには任意の PHP コードを含めることができます。
  25. このメソッドは PHP 関数
  26. <ulink url="http://php.net/include"><code>include()</code></ulink>
  27. のラッパーで、失敗した場合 (たとえば指定したファイルが存在しないなど)
  28. には false を返します。
  29. </para>
  30. <example id="zend.loader.load.file.example">
  31. <title>loadFile() メソッドの例</title>
  32. <programlisting role="php"><![CDATA[
  33. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  34. ]]>
  35. </programlisting>
  36. </example>
  37. <para>
  38. 引数 <code>$filename</code> には読み込むファイル名を指定します。
  39. ここにはパス情報を含めてはいけません。<code>$filename</code>
  40. に対してはセキュリティチェックが行われます。
  41. <code>$filename</code> に含めることができるのは英数字、ダッシュ ("-")、
  42. アンダースコア ("_") あるいはピリオド (".") だけです。
  43. 引数 <code>$dirs</code> にはそのような制限はありません。
  44. </para>
  45. <para>
  46. 引数 <code>$dirs</code> にはファイルを探すディレクトリを指定します。
  47. <code>NULL</code> の場合は <code>include_path</code> の中のみを対象とします。
  48. 文字列あるいは配列を指定すると、指定されたディレクトリをまず探した後で、
  49. それから <code>include_path</code> を探します。
  50. </para>
  51. <para>
  52. 引数 <code>$once</code> は論理値です。<code>TRUE</code> を指定すると、
  53. <classname>Zend_Loader::loadFile()</classname> は PHP の関数
  54. <ulink url="http://php.net/include"><code>include_once()</code></ulink>
  55. でファイルを読み込みます。それ以外の場合は
  56. <ulink url="http://php.net/include_once"><code>include()</code></ulink>
  57. を使用します。
  58. </para>
  59. </sect2>
  60. <sect2 id="zend.loader.load.class">
  61. <title>クラスの読み込み</title>
  62. <para>
  63. 静的メソッド <classname>Zend_Loader::loadClass($class, $dirs)</classname>
  64. は、PHP ファイルを読み込んでクラスが存在するかどうかを確かめます。
  65. </para>
  66. <example id="zend.loader.load.class.example">
  67. <title>loadClass() メソッドの例</title>
  68. <programlisting role="php"><![CDATA[
  69. Zend_Loader::loadClass('Container_Tree',
  70. array(
  71. '/home/production/mylib',
  72. '/home/production/myapp'
  73. )
  74. );
  75. ]]>
  76. </programlisting>
  77. </example>
  78. <para>
  79. クラスを指定する文字列は、アンダースコアを OS のパス区切り文字に変換して最後に
  80. '.php' を追加したものとなります。上の例では、Windows 上で
  81. 'Container_Tree' は 'Container/Tree.php' となります。
  82. </para>
  83. <para>
  84. <code>$dirs</code> に文字列あるいは配列を指定すると、
  85. <classname>Zend_Loader::loadClass()</classname> は指定した順にそのディレクトリを探します。
  86. そして最初に見つかったファイルを読み込みます。
  87. ディレクトリ <code>$dirs</code> にファイルがみつからない場合は、
  88. PHP の <code>include_path</code> で指定された場所を探します。
  89. </para>
  90. <para>
  91. ファイルが見つからない場合、あるいは読み込んだファイルにクラスが存在しない場合は
  92. <classname>Zend_Loader::loadClass()</classname> は <classname>Zend_Exception</classname>
  93. をスローします。
  94. </para>
  95. <para>
  96. ファイルの読み込みには <classname>Zend_Loader::loadFile()</classname> を使用するので、
  97. クラス名として指定できるのは
  98. 英数字とハイフン ('-')、アンダースコア ('_') そしてピリオド ('.') だけです。
  99. </para>
  100. </sect2>
  101. <sect2 id="zend.loader.load.isreadable">
  102. <title>ファイルが読み込み可能かどうかの確認</title>
  103. <para>
  104. 静的メソッド <classname>Zend_Loader::isReadable($pathname)</classname>
  105. は、指定した場所にファイルが存在して読み込み可能な場合に
  106. <code>TRUE</code>、それ以外の場合に <code>FALSE</code> を返します。
  107. </para>
  108. <example id="zend.loader.load.isreadable.example">
  109. <title>isReadable() メソッドの例</title>
  110. <programlisting role="php"><![CDATA[
  111. if (Zend_Loader::isReadable($filename)) {
  112. // $filename で何かをします
  113. }
  114. ]]>
  115. </programlisting>
  116. </example>
  117. <para>
  118. 引数 <code>$filename</code> で、調べたいファイル名を指定します。
  119. ここにはパス情報を含めることもできます。
  120. このメソッドは、PHP の関数
  121. <ulink url="http://php.net/is_readable"><code>is_readable()</code></ulink>
  122. のラッパーです。この関数は <code>include_path</code>
  123. を探しませんが、<classname>Zend_Loader::isReadable()</classname>
  124. は <code>include_path</code> も検索対象に含めます。
  125. </para>
  126. </sect2>
  127. <sect2 id="zend.loader.load.autoload">
  128. <title>Autoloader の使用法</title>
  129. <para>
  130. <classname>Zend_Loader</classname> クラスには、PHP の SPL
  131. 自動ローダーに登録するためのメソッドが含まれています。そのコールバックメソッドが
  132. <classname>Zend_Loader::autoload()</classname> です。利便性を考慮して、
  133. <classname>Zend_Loader</classname> では <code>registerAutoload()</code> 関数を提供しています。
  134. この関数は、<code>autoload()</code> メソッドを登録するものです。
  135. <code>spl_autoload</code> 拡張モジュールが使用できない環境の場合は、
  136. <code>registerAutoload()</code> メソッドは <classname>Zend_Exception</classname> をスローします。
  137. </para>
  138. <example id="zend.loader.load.autoload.example">
  139. <title>自動ローダー用コールバックメソッドの登録例</title>
  140. <programlisting role="php"><![CDATA[
  141. Zend_Loader::registerAutoload();
  142. ]]>
  143. </programlisting>
  144. </example>
  145. <para>
  146. Zend Framework の autoload コールバックを登録すると、
  147. 明示的に読み込まなくても Zend Framework のクラスを参照できるようになります。
  148. <code>autoload()</code> メソッドは、クラスを参照する際に自動的に
  149. <classname>Zend_Loader::loadClass()</classname> を使用します。
  150. </para>
  151. <para>
  152. <classname>Zend_Loader</classname> クラスを継承した場合は、<code>registerAutoload()</code>
  153. に引数を追加することができます。この引数で、どのクラスから
  154. <code>autoload()</code> メソッドを登録するのかを指定します。
  155. </para>
  156. <example id="zend.loader.load.autoload.example-extended">
  157. <title>autoload コールバックメソッドを継承クラスから登録する例</title>
  158. <para>
  159. PHP における静的関数の参照の方法上、
  160. <code>loadClass()</code> と <code>autoload()</code>
  161. の両方のコードを実装する必要があります。
  162. そして、<code>autoload()</code> では
  163. <code>self::loadClass()</code> をコールしなければなりません。
  164. 作成する <code>autoload()</code> メソッドが親クラスに
  165. <code>self::loadClass()</code> の処理を任せるのなら、
  166. サブクラスのメソッドではなく親クラス側の同名のメソッドをコールします。
  167. </para>
  168. <programlisting role="php"><![CDATA[
  169. class My_Loader extends Zend_Loader
  170. {
  171. public static function loadClass($class, $dirs = null)
  172. {
  173. parent::loadClass($class, $dirs);
  174. }
  175. public static function autoload($class)
  176. {
  177. try {
  178. self::loadClass($class);
  179. return $class;
  180. } catch (Exception $e) {
  181. return false;
  182. }
  183. }
  184. }
  185. Zend_Loader::registerAutoload('My_Loader');
  186. ]]>
  187. </programlisting>
  188. </example>
  189. <para>
  190. autoload コールバックを削除することもできます。
  191. <code>registerAutoload()</code> にはオプションで 2 番目の引数を指定することができ、
  192. デフォルトでは <code>true</code> が設定されるようになっています。
  193. この引数を <code>false</code> とすると、
  194. 指定したコールバックが SPL の autoload スタックから削除されます。
  195. </para>
  196. </sect2>
  197. </sect1>
  198. <!--
  199. vim:se ts=4 sw=4 et:
  200. -->