-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathautoload.xml
151 lines (140 loc) · 4.98 KB
/
autoload.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 22583751fbfdaa3eaa41aeb6470d1343f5cb2c78 Maintainer: hirokawa Status: ready -->
<!-- Credits: mumumu -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>クラスのオートローディング</title>
<para>
オブジェクト指向アプリケーションを作成する開発者の多くは、
クラス定義毎に一つのPHPソースファイルを作成します。
最大の問題は、各スクリプトの先頭に、必要な読み込みを行う長いリストを
記述する必要があることです(各クラスについて一つ)。
</para>
<para>
<function>spl_autoload_register</function> 関数を使うと、
任意の数のオートローダーを登録でき、
クラスやインターフェイスが定義されていなくても自動的に読み込めるようになります。
オートローダーを登録すれば、PHPがエラーで止まる前にクラスをロードする最後の
チャンスが与えられます。
</para>
<para>
クラスに類似した言語構造は、同じやり方でオートロードできます。
これには、クラス、インターフェイス、トレイト、列挙型が含まれます。
</para>
<caution>
<para>
PHP 8.0.0 より前のバージョンでは、
<function>__autoload</function> 関数でもクラスやインターフェイスのオートロードが可能でした。
しかし、この関数は
<function>spl_autoload_register</function> 関数に比べると柔軟性という点で劣っています。
そのため、<function>__autoload</function>
関数は PHP 7.2.0 で推奨されなくなり、
PHP 8.0.0 で削除されました。
</para>
</caution>
<note>
<para>
複数のオートローダーを複数回登録するために、
<function>spl_autoload_register</function>
を複数回コールしても構いません。
但し、オートロードを行う関数から例外がスローされると、
オートロードのプロセスが中断され、
後続のオートロード関数の実行ができなくなります。
よって、オートロード関数から例外をスローすることは、
全くお勧めできません。
</para>
</note>
<para>
<example>
<title>オートロードの例</title>
<para>
この例は、 クラス <literal>MyClass1</literal> および
<literal>MyClass2</literal> をそれぞれ
<filename>MyClass1.php</filename> および
<filename>MyClass2.php</filename> からロードします。
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
]]>
</programlisting>
</example>
<example>
<title>オートロードの別の例</title>
<para>
この例は、インターフェイス <literal>ITest</literal> をロードしようとします。
</para>
<programlisting role="php">
<![CDATA[
<?php
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
]]>
</programlisting>
</example>
<example>
<title>Composerのオートローダーの利用</title>
<simpara>
&link.composer; は <literal>vendor/autoload.php</literal> ファイルを生成します。
これは Composer によって管理されているパッケージを自動的に読み込むよう設定されています。
このファイルを読み込むことで、これらのパッケージを追加の作業なしで利用できるようになります。
</simpara>
<programlisting role="php">
<![CDATA[
<?php
require __DIR__ . '/vendor/autoload.php';
$uuid = new Ramsey\Uuid\Uuid::uuid7();
echo "Generated new UUID -> ", $uuid->toString(), "\n";
?>
]]>
</programlisting>
</example>
</para>
<simplesect role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>unserialize</function></member>
<member><link linkend="ini.unserialize-callback-func">unserialize_callback_func</link></member>
<member><link linkend="ini.unserialize-max-depth">unserialize_max_depth</link></member>
<member><function>spl_autoload_register</function></member>
<member><function>spl_autoload</function></member>
<member><function>__autoload</function></member>
</simplelist>
</para>
</simplesect>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->