Zend_Loader.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 24249 -->
  4. <sect1 id="zend.loader.load">
  5. <title>ファイルやクラスの動的な読み込み</title>
  6. <para>
  7. <classname>Zend_Loader</classname> クラスは、ファイルを動的に読み込むためのメソッドを提供します。
  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"><methodname>require_once()</methodname></ulink>
  16. のような <acronym>PHP</acronym> の関数ではなくあえて <classname>Zend_Loader</classname> を使用するメリットはありません。
  17. </para>
  18. </tip>
  19. <sect2 id="zend.loader.load.file">
  20. <title>ファイルの読み込み</title>
  21. <para>
  22. 静的メソッド <methodname>Zend_Loader::loadFile()</methodname>
  23. は、<acronym>PHP</acronym> ファイルを読み込みます。
  24. 読み込まれるファイルには任意の <acronym>PHP</acronym> コードを含めることができます。
  25. このメソッドは <acronym>PHP</acronym> 関数
  26. <ulink url="http://php.net/include"><methodname>include()</methodname></ulink>
  27. のラッパーで、失敗した場合 (たとえば指定したファイルが存在しないなど)
  28. には <constant>FALSE</constant> を返します。
  29. </para>
  30. <example id="zend.loader.load.file.example">
  31. <title>loadFile() メソッドの例</title>
  32. <programlisting language="php"><![CDATA[
  33. Zend_Loader::loadFile($filename, $dirs=null, $once=false);
  34. ]]></programlisting>
  35. </example>
  36. <para>
  37. 引数 <code>$filename</code> には読み込むファイル名を指定します。
  38. ここにはパス情報を含めてはいけません。<code>$filename</code>
  39. に対してはセキュリティチェックが行われます。
  40. <code>$filename</code> に含めることができるのは英数字、ダッシュ ("-")、
  41. アンダースコア ("_") あるいはピリオド (".") だけです。
  42. 引数 <code>$dirs</code> にはそのような制限はありません。
  43. </para>
  44. <para>
  45. 引数 <code>$dirs</code> にはファイルを探すディレクトリを指定します。
  46. <constant>NULL</constant> の場合は <property>include_path</property> の中のみを対象とします。
  47. 文字列あるいは配列を指定すると、指定されたディレクトリをまず探した後で、
  48. それから <property>include_path</property> を探します。
  49. </para>
  50. <para>
  51. 引数 <code>$once</code> は論理値です。<constant>TRUE</constant> を指定すると、
  52. <methodname>Zend_Loader::loadFile()</methodname> は <acronym>PHP</acronym> の関数
  53. <ulink url="http://php.net/include"><methodname>include_once()</methodname></ulink>
  54. でファイルを読み込みます。それ以外の場合は
  55. <ulink url="http://php.net/include_once"><methodname>include()</methodname></ulink>
  56. を使用します。
  57. </para>
  58. </sect2>
  59. <sect2 id="zend.loader.load.class">
  60. <title>クラスの読み込み</title>
  61. <para>
  62. 静的メソッド <methodname>Zend_Loader::loadClass($class, $dirs)</methodname>
  63. は、<acronym>PHP</acronym> ファイルを読み込んでクラスが存在するかどうかを確かめます。
  64. </para>
  65. <example id="zend.loader.load.class.example">
  66. <title>loadClass() メソッドの例</title>
  67. <programlisting language="php"><![CDATA[
  68. Zend_Loader::loadClass('Container_Tree',
  69. array(
  70. '/home/production/mylib',
  71. '/home/production/myapp'
  72. )
  73. );
  74. ]]></programlisting>
  75. </example>
  76. <para>
  77. クラスを指定する文字列は、アンダースコアを OS のパス区切り文字に変換して最後に
  78. '.php' を追加したものとなります。上の例では、Windows 上で
  79. 'Container_Tree' は 'Container\\Tree.php' となります。
  80. </para>
  81. <para>
  82. <code>$dirs</code> に文字列あるいは配列を指定すると、
  83. <methodname>Zend_Loader::loadClass()</methodname> は指定した順にそのディレクトリを探します。
  84. そして最初に見つかったファイルを読み込みます。
  85. ディレクトリ <code>$dirs</code> にファイルがみつからない場合は、
  86. <acronym>PHP</acronym> の <property>include_path</property> で指定された場所を探します。
  87. </para>
  88. <para>
  89. ファイルが見つからない場合、あるいは読み込んだファイルにクラスが存在しない場合は
  90. <methodname>Zend_Loader::loadClass()</methodname> は <classname>Zend_Exception</classname>
  91. をスローします。
  92. </para>
  93. <para>
  94. ファイルの読み込みには <methodname>Zend_Loader::loadFile()</methodname> を使用するので、
  95. クラス名として指定できるのは
  96. 英数字とハイフン ('-')、アンダースコア ('_') そしてピリオド ('.') だけです。
  97. </para>
  98. <!-- TODO : to be translated -->
  99. <note>
  100. <title>Loading Classes from PHP Namespaces</title>
  101. <para>
  102. Starting in version 1.10.0, Zend Framework now allows loading classes from <acronym>PHP</acronym>
  103. namespaces. This support follows the same guidelines and implementation as that
  104. found in the <ulink
  105. url="http://groups.google.com/group/php-standards/web/psr-0-final-proposal">PHP
  106. Framework Interop Group PSR-0</ulink> reference implementation.
  107. </para>
  108. <para>
  109. Under this guideline, the following rules apply:
  110. </para>
  111. <itemizedlist>
  112. <listitem>
  113. <para>
  114. Each namespace separator is converted to a
  115. <constant>DIRECTORY_SEPARATOR</constant> when loading from the file system.
  116. </para>
  117. </listitem>
  118. <listitem>
  119. <para>
  120. Each "_" character in the <emphasis>CLASS NAME</emphasis> is converted to a
  121. <constant>DIRECTORY_SEPARATOR</constant>. The "_" character has no special
  122. meaning in the namespace.
  123. </para>
  124. </listitem>
  125. <listitem>
  126. <para>
  127. The fully-qualified namespace and class is suffixed with ".php" when loading
  128. from the file system.
  129. </para>
  130. </listitem>
  131. </itemizedlist>
  132. <para>
  133. As examples:
  134. </para>
  135. <itemizedlist>
  136. <listitem>
  137. <para>
  138. <classname>\Doctrine\Common\IsolatedClassLoader</classname> =&gt;
  139. <filename>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php</filename>
  140. </para>
  141. </listitem>
  142. <listitem>
  143. <para>
  144. <classname>\namespace\package\Class_Name</classname> =&gt;
  145. <filename>/path/to/project/lib/vendor/namespace/package/Class/Name.php</filename>
  146. </para>
  147. </listitem>
  148. <listitem>
  149. <para>
  150. <classname>\namespace\package_name\Class_Name</classname> =&gt;
  151. <filename>/path/to/project/lib/vendor/namespace/package_name/Class/Name.php</filename>
  152. </para>
  153. </listitem>
  154. </itemizedlist>
  155. </note>
  156. </sect2>
  157. <sect2 id="zend.loader.load.isreadable">
  158. <title>ファイルが読み込み可能かどうかの確認</title>
  159. <para>
  160. 静的メソッド <methodname>Zend_Loader::isReadable($pathname)</methodname>
  161. は、指定した場所にファイルが存在して読み込み可能な場合に
  162. <constant>TRUE</constant>、それ以外の場合に <constant>FALSE</constant> を返します。
  163. </para>
  164. <example id="zend.loader.load.isreadable.example">
  165. <title>isReadable() メソッドの例</title>
  166. <programlisting language="php"><![CDATA[
  167. if (Zend_Loader::isReadable($filename)) {
  168. // $filename で何かをします
  169. }
  170. ]]></programlisting>
  171. </example>
  172. <para>
  173. 引数 <code>$filename</code> で、調べたいファイル名を指定します。
  174. ここにはパス情報を含めることもできます。
  175. このメソッドは、<acronym>PHP</acronym> の関数
  176. <ulink url="http://php.net/is_readable"><methodname>is_readable()</methodname></ulink>
  177. のラッパーです。この関数は <property>include_path</property>
  178. を探しませんが、<methodname>Zend_Loader::isReadable()</methodname>
  179. は <property>include_path</property> も検索対象に含めます。
  180. </para>
  181. </sect2>
  182. <sect2 id="zend.loader.load.autoload">
  183. <title>Autoloader の使用法</title>
  184. <para>
  185. <classname>Zend_Loader</classname> クラスには、<acronym>PHP</acronym> の SPL
  186. 自動ローダーに登録するためのメソッドが含まれています。そのコールバックメソッドが
  187. <methodname>Zend_Loader::autoload()</methodname> です。利便性を考慮して、
  188. <classname>Zend_Loader</classname> では <methodname>registerAutoload()</methodname> 関数を提供しています。
  189. この関数は、<methodname>autoload()</methodname> メソッドを登録するものです。
  190. <code>spl_autoload</code> 拡張モジュールが使用できない環境の場合は、
  191. <methodname>registerAutoload()</methodname> メソッドは <classname>Zend_Exception</classname> をスローします。
  192. </para>
  193. <example id="zend.loader.load.autoload.example">
  194. <title>自動ローダー用コールバックメソッドの登録例</title>
  195. <programlisting language="php"><![CDATA[
  196. Zend_Loader::registerAutoload();
  197. ]]></programlisting>
  198. </example>
  199. <para>
  200. Zend Framework の autoload コールバックを登録すると、
  201. 明示的に読み込まなくても Zend Framework のクラスを参照できるようになります。
  202. <methodname>autoload()</methodname> メソッドは、クラスを参照する際に自動的に
  203. <methodname>Zend_Loader::loadClass()</methodname> を使用します。
  204. </para>
  205. <para>
  206. <classname>Zend_Loader</classname> クラスを継承した場合は、<methodname>registerAutoload()</methodname>
  207. に引数を追加できます。この引数で、どのクラスから
  208. <methodname>autoload()</methodname> メソッドを登録するのかを指定します。
  209. </para>
  210. <example id="zend.loader.load.autoload.example-extended">
  211. <title>autoload コールバックメソッドを継承クラスから登録する例</title>
  212. <para>
  213. <acronym>PHP</acronym> における静的関数の参照の方法上、
  214. <methodname>loadClass()</methodname> と <methodname>autoload()</methodname>
  215. の両方のコードを実装する必要があります。
  216. そして、<methodname>autoload()</methodname> では
  217. <methodname>self::loadClass()</methodname> をコールしなければなりません。
  218. 作成する <methodname>autoload()</methodname> メソッドが親クラスに
  219. <methodname>self::loadClass()</methodname> の処理を任せるのなら、
  220. サブクラスのメソッドではなく親クラス側の同名のメソッドをコールします。
  221. </para>
  222. <programlisting language="php"><![CDATA[
  223. class My_Loader extends Zend_Loader
  224. {
  225. public static function loadClass($class, $dirs = null)
  226. {
  227. parent::loadClass($class, $dirs);
  228. }
  229. public static function autoload($class)
  230. {
  231. try {
  232. self::loadClass($class);
  233. return $class;
  234. } catch (Exception $e) {
  235. return false;
  236. }
  237. }
  238. }
  239. Zend_Loader::registerAutoload('My_Loader');
  240. ]]></programlisting>
  241. </example>
  242. <para>
  243. autoload コールバックを削除することもできます。
  244. <methodname>registerAutoload()</methodname> にはオプションで 2 番目の引数を指定することができ、
  245. デフォルトでは <constant>TRUE</constant> が設定されるようになっています。
  246. この引数を <constant>FALSE</constant> とすると、
  247. 指定したコールバックが SPL の autoload スタックから削除されます。
  248. </para>
  249. </sect2>
  250. </sect1>
  251. <!--
  252. vim:se ts=4 sw=4 et:
  253. -->