-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathautoload.xml
153 lines (143 loc) · 4.74 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
152
153
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: c1f37a6c270aadbbb3da56a3973ffd62197adf2b Maintainer: simp Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: fca50d321ce57036f3786f278887abe58cd41de8 Reviewer: samesch -->
<!-- Credits: hholzgra -->
<sect1 xml:id="language.oop5.autoload" xmlns="http://docbook.org/ns/docbook">
<title>Automatisches Laden von Klassen</title>
<para>
Viele Entwickler, die objektorientierte Anwendungen entwickeln, erzeugen
für jede Klassendefinition eine eigene PHP-Quelldatei. Eines der größten
Ärgernisse ist die Notwendigkeit, am Anfang eines jeden Skripts eine lange
Liste von benötigten Include-Anweisungen (eine für jede Klasse) schreiben
zu müssen.
</para>
<para>
Die Funktion <function>spl_autoload_register</function> registriert eine
beliebige Anzahl von Autoladern, die es ermöglichen, dass Klassen und
Schnittstellen automatisch geladen werden, wenn sie derzeit nicht definiert
sind. Durch das Registrieren von Autoladern erhält PHP einen letzten Versuch,
die Klasse oder Schnittstelle zu laden, bevor es unter Ausgabe einer
Fehlermeldung scheitert.
</para>
<para>
Jedes klassenähnliche Konstrukt kann auf die gleiche Weise automatisch
geladen werden. Dazu gehören Klassen, Schnittstellen, Traits und
Aufzählungen.
</para>
<caution>
<para>
Vor PHP 8.0.0 war es möglich, <function>__autoload</function> zu
verwenden, um Klassen und Schnittstellen automatisch zu laden. Dies ist
jedoch eine weniger flexible Alternative zu
<function>spl_autoload_register</function>.
<function>__autoload</function> ist seit PHP 7.2.0 veraltet und wurde in
PHP 8.0.0 entfernt.
</para>
</caution>
<note>
<para>
Die Funktion <function>spl_autoload_register</function> kann mehrfach
aufgerufen werden, um mehrere Autoloader zu registrieren. Wenn von einer
Autoload-Funktion eine Exception ausgelöst wird, wird dieser Vorgang
jedoch unterbrochen und es werden keine weiteren Autoload-Funktionen
ausgeführt. Aus diesem Grund wird dringend davon abgeraten, von einer
Autoload-Funktion aus eine Exception auszulösen.
</para>
</note>
<para>
<example>
<title>Autoload-Beispiel</title>
<para>
Dieses Beispiel versucht die Klassen <literal>MyClass1</literal> und
<literal>MyClass2</literal> aus den entsprechenden Dateien
<filename>MyClass1.php</filename> und <filename>MyClass2.php</filename>
zu laden.
</para>
<programlisting role="php" annotations="interactive">
<![CDATA[
<?php
spl_autoload_register(function ($class_name) {
include $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
]]>
</programlisting>
</example>
<example>
<title>Weiteres Autoload-Beispiel</title>
<para>
Dieses Beispiel versucht, das Interface <literal>ITest</literal>
zu laden.
</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>Verwenden des Composer-Autoloaders</title>
<simpara>
Der &link.composer; erzeugt eine <literal>vendor/autoload.php</literal>,
die so konfiguriert ist, dass sie die vom Composer verwalteten Pakete
automatisch lädt. Durch das Einbinden dieser Datei können diese Pakete
ohne zusätzlichen Aufwand verwendet werden.
</simpara>
<programlisting role="php" annotations="interactive">
<![CDATA[
<?php
require __DIR__ . '/vendor/autoload.php';
$uuid = Ramsey\Uuid\Uuid::uuid7();
echo "Neue UUID erzeugt -> ", $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
-->