-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathconstants.xml
402 lines (374 loc) · 13.9 KB
/
constants.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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f4f96ef8b2a95283c92ea2183fe1dedf06f3ad22 Maintainer: sammywg Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: 5a945dfef09a9595c83855cdb858ffa4a96af305 Reviewer: samesch -->
<chapter xml:id="language.constants" xmlns="http://docbook.org/ns/docbook">
<title>Konstanten</title>
<simpara>
Eine Konstante ist ein Bezeichner (Name) für einen einfachen Wert. Wie der
Name bereits nahelegt, kann der Wert einer Konstanten zur Laufzeit des
Skripts nicht verändert werden (außer bei
<link linkend="language.constants.magic">Magischen Konstanten</link>, die
nicht wirklich Konstanten sind). Konstanten unterscheiden standardmäßig
zwischen Groß- und Kleinschreibung. Nach gängiger Konvention werden
Konstanten immer in Großbuchstaben geschrieben.
</simpara>
<note>
<para>
Vor PHP 8.0.0 konnten Konstanten, die mit der Funktion
<function>define</function> definiert wurden, ohne Berücksichtigung der
Groß- und Kleinschreibung verwendet werden.
</para>
</note>
<para>
Der Name einer Konstanten folgt den gleichen Regeln wie alle anderen
Bezeichner in PHP. Ein gültiger Name beginnt mit einem Buchstaben oder
einem Unterstrich, gefolgt von beliebig vielen Buchstaben, Ziffern oder
Unterstrichen. Als regulärer Ausdruck könnte das so beschrieben werden:
<code>^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>
</para>
<para>
Es ist möglich, Konstanten mit reservierten oder gar ungültigen Namen
mittels <function>define</function> zu definieren, deren Wert nur mit der
Funktion <function>constant</function> gelesen werden kann. Allerdings wird
dies nicht empfohlen.
</para>
&tip.userlandnaming;
<para>
<!-- TODO Move into syntax section? -->
<example>
<title>Gültige und ungültige Namen für Konstanten</title>
<programlisting role="php">
<![CDATA[
<?php
// Gültige Namen für Konstanten
define("FOO", "irgendwas");
define("FOO2", "etwas anderes");
define("FOO_BAR", "irgendwas ganz anderes");
// Ungültige Namen für Konstanten
define("2FOO", "irgendwas");
// Folgendes ist korrekt, sollte aber vermieden werden:
// PHP könnte eines Tages eine magische Konstante unterstützen,
// die Ihr Skript nicht mehr wie gewünscht funktionieren lässt
define("__FOO__", "irgendwas");
?>
]]>
</programlisting>
</example>
</para>
<note>
<simpara>
Für unsere Zwecke ist hier ein Buchstabe a-z, A-Z und die ASCII-Zeichen
von 128 bis 255 (0x80-0xff).
</simpara>
</note>
<simpara>
Wie bei &link.superglobals; ist der Geltungsbereich einer Konstanten
global. Unabhängig vom Geltungsbereich kann in einem Skript überall auf
eine Konstante zugegriffen werden. Für mehr Information zum Geltungsbereich
lesen Sie bitte den Abschnitt über den
<link linkend="language.variables.scope">Geltungsbereich von Variablen</link>.
</simpara>
<note>
<simpara>
Seit PHP 7.1.0 können Klassenkonstanten eine Sichtbarkeit von protected
oder private deklarieren, wodurch sie nur im hierarchischen Bereich der
Klasse zur Verfügung stehen, in der sie definiert sind.
</simpara>
</note>
<sect1 xml:id="language.constants.syntax">
<title>Syntax</title>
<simpara>
Konstanten können mit dem Schlüsselwort <literal>const</literal> oder mit
der Funktion <function>define</function> definiert werden. Während
<function>define</function> es ermöglicht, eine Konstante auf einen
beliebigen Wert zu definieren, hat das Schlüsselwort
<literal>const</literal> Einschränkungen, die im nächsten Absatz
beschrieben werden. Einmal definiert, kann eine Konstante weder verändert
noch gelöscht werden.
</simpara>
<simpara>
Wenn das Schlüsselwort <literal>const</literal> verwendet wird, werden nur
skalare Ausdrücke (<type>bool</type>, <type>int</type>, <type>float</type>
und <type>string</type>) und konstante <type>Array</type>s, die nur
skalare Ausdrücke enthalten, akzeptiert. Es ist möglich, Konstanten vom
Typ <type>resource</type> zu definieren, dies sollte allerdings vermieden
werden, da es zu unerwarteten Ergebnissen führen kann.
</simpara>
<simpara>
Auf den Wert einer Konstanten wird einfach durch die Angabe ihres Namens
zugegriffen. Im Gegensatz zu Variablen wird einer Konstanten
<emphasis>kein</emphasis> <literal>$</literal> vorangestellt. Ebenso kann
die Funktion <function>constant</function> verwendet werden, um den Wert
einer Konstanten auszulesen, wenn der Name der Konstanten dynamisch
ermittelt wird. Mit der Funktion
<function>get_defined_constants</function> erhält man eine Liste aller
definierten Konstanten.
</simpara>
<note>
<simpara>
Konstanten und (globale) Variablen befinden sich in unterschiedlichen
Namensräumen. Das hat zum Beispiel zur Folge, dass &true; und
<varname>$TRUE</varname> etwas völlig Verschiedenes sind.
</simpara>
</note>
<simpara>
Falls eine undefinierte Konstante verwendet wird, wird ein
<classname>Error</classname> ausgelöst. Vor PHP 8.0.0 wurden undefinierte
Konstanten als einfaches <type>&string;</type>-Wort (&dh; CONSTANT vs
"CONSTANT") interpretiert. Dieses Rückfallverhalten ist von PHP 7.2.0 an
missbilligt, und ein Fehler der Stufe <constant>E_WARNING</constant> wird
ausgelöst, wenn es dazu kommt. Vor PHP 7.2.0 wurde stattdessen ein Fehler
der Stufe
<link linkend="ref.errorfunc">E_NOTICE</link><constant>E_NOTICE</constant>
ausgelöst. Siehe auch den Abschnitt im Handbuch, der erklärt, warum
<link linkend="language.types.array.foo-bar">$foo[bar]</link> falsch ist
(es sei denn, <literal>bar</literal> ist eine Konstante). Dies gilt nicht
für
<link linkend="language.namespaces.rules">(vollständig) qualifizierte Konstanten</link>,
die immer einen <classname>Error</classname> auslösen, wenn sie
undefiniert sind.
</simpara>
<note>
<simpara>
Um zu prüfen, ob eine Konstante gesetzt ist, kann die Funktion
<function>defined</function> verwendet werden.
</simpara>
</note>
<para>
Dies sind die Unterschiede zwischen Konstanten und Variablen:
<itemizedlist>
<listitem>
<simpara>
Konstanten haben kein Dollarzeichen (<literal>$</literal>) vorangestellt;
</simpara>
</listitem>
<listitem>
<simpara>
Konstanten können überall definiert werden und auf Ihren Wert kann ohne
Rücksicht auf die Regeln des Geltungsbereichs von Variablen zugegriffen
werden;
</simpara>
</listitem>
<listitem>
<simpara>
Sobald Konstanten definiert sind, können sie nicht neu definiert oder
gelöscht werden; und
</simpara>
</listitem>
<listitem>
<simpara>
Konstanten können nur als skalare Werte oder Arrays ausgewertet werden.
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
<example>
<title>Definition von Konstanten</title>
<programlisting role="php">
<![CDATA[
<?php
define("KONSTANTE", "Hallo Welt.");
echo KONSTANTE; // Ausgabe: "Hallo Welt."
echo Konstante; // Gibt einen Fehler aus: Undefined Constant "Konstante"
// Vor PHP 8.0.0 wird "Konstante" ausgegeben und eine
// Warnung angezeigt.
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>Definition von Konstanten unter Verwendung des Schlüsselworts <literal>const</literal></title>
<programlisting role="php">
<![CDATA[
<?php
// Einfacher skalarer Wert
const KONSTANTE = 'Hallo Welt';
echo KONSTANTE;
// Skalarer Ausdruck
const ANDERE_KONSTANTE = KONSTANTE . '; Ade Welt';
echo ANDERE_KONSTANTE;
const ANIMALS = array('Hund', 'Katze', 'Maus');
echo ANIMALS[1]; // gibt "Katze" aus
// Array-Konstante
define('ANIMALS', array(
'Hund',
'Katze',
'Maus'
));
echo ANIMALS[1]; // gibt "Katze" aus
?>
]]>
</programlisting>
</example>
</para>
<note>
<para>
Im Gegensatz zu Konstanten, welche mit <function>define</function>
erstellt werden, müssen über <literal>const</literal> definierte
Konstanten auf der höchsten Ebene erstellt werden, weil sie bei der
Kompilierung definiert werden. Das heißt, dass sie nicht innerhalb von
Funktionen, Schleifen, <literal>if</literal>-Anweisungen oder
<literal>try</literal>/<literal>catch</literal>-Blöcken definiert werden
können.
</para>
</note>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.constants">Klassenkonstanten</link></member>
</simplelist>
</para>
</sect2>
</sect1>
<sect1 xml:id="language.constants.predefined">
<title>Vordefinierte Konstanten</title>
<simpara>
PHP stellt jedem Skript zur Laufzeit eine Vielzahl von
<link linkend="reserved.constants">vordefinierten Konstanten</link> zur
Verfügung. Viele dieser Konstanten werden jedoch von verschiedenen
Erweiterungen definiert, die nur zur Verfügung stehen, wenn diese
Erweiterungen selbst zur Verfügung stehen, &dh; entweder über dynamisches
Laden zur Laufzeit oder Einkompilieren.
</simpara>
</sect1>
<sect1 xml:id="language.constants.magic">
<title>Magische Konstanten</title>
<para>
Es gibt ein paar magische Konstanten, die, abhängig davon, wo sie eingesetzt
werden, einen unterschiedlichen Wert haben. Zum Beispiel hängt der Wert
der Konstanten <constant>__LINE__</constant> davon ab, in welcher Zeile
des Skripts diese Konstante verwendet wird. Alle diese "magischen"
Konstanten werden während der Kompilierzeit aufgelöst, im Gegensatz zu
regulären Konstanten, die während der Laufzeit aufgelöst werden. Diese
besonderen Konstanten sind unabhängig von Groß-/Kleinschreibung und sind
folgende:
</para>
<para>
<table>
<title>PHP's magische Konstanten</title>
<tgroup cols="2">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row xml:id="constant.line">
<entry><constant>__LINE__</constant></entry>
<entry>
Die aktuelle Zeilennummer einer Datei.
</entry>
</row>
<row xml:id="constant.file">
<entry><constant>__FILE__</constant></entry>
<entry>
Der vollständige Pfad- und Dateiname einer Datei mit aufgelösten
Symlinks. Wird diese Konstante innerhalb einer nachgeladenen Datei
verwendet, wird der Name dieser eingebundenen Datei zurückgegeben.
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
Der Name des Verzeichnisses, in dem sich die Datei befindet. Wird die
Konstante innerhalb eines Includes verwendet, wird das Verzeichnis
der eingebundenen Datei zurückgegeben. Dies entspricht dem Verhalten
von <literal>dirname(__FILE__)</literal>. Der Verzeichnisname hat
keinen beendenden Schrägstrich, sofern es sich nicht um das
Rootverzeichnis handelt.
</entry>
</row>
<row xml:id="constant.function">
<entry><constant>__FUNCTION__</constant></entry>
<entry>
Der Name der Funktion, oder <literal>{closure}</literal> für anonyme
Funktionen.
</entry>
</row>
<row xml:id="constant.class">
<entry><constant>__CLASS__</constant></entry>
<entry>
Der Name einer Klasse. Der Klassenname enthält den Namen des
Namensraums, in dem sie deklariert wurde (&zb;
<literal>Foo\Bar</literal>). Bei Verwendung innerhalb einer
Trait-Methode ist <constant>__CLASS__</constant> der Name der Klasse,
in der der Trait verwendet wird.
</entry>
</row>
<row xml:id="constant.trait">
<entry><constant>__TRAIT__</constant></entry>
<entry>
Der Name eines Traits. Dieser enthält auch den Namensraum, in welchem
der Trait definiert wurde (&zb; <literal>Foo\Bar</literal>).
</entry>
</row>
<row xml:id="constant.method">
<entry><constant>__METHOD__</constant></entry>
<entry>
Der Name der Klassenmethode.
</entry>
</row>
<row xml:id="constant.property">
<entry><constant>__PROPERTY__</constant></entry>
<entry>
Nur gültig innerhalb eines
<link linkend="language.oop5.property-hooks">Eigenschafts-Hooks</link>;
entspricht dem Namen der Eigenschaft.
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
Der Name des aktuellen Namensraums.
</entry>
</row>
<row xml:id="constant.coloncolonclass">
<entry><constant><replaceable>ClassName</replaceable>::class</constant></entry>
<entry>
Der vollständig qualifizierte Klassenname.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.basic.class.class">::class</link></member>
<member><function>get_class</function></member>
<member><function>get_object_vars</function></member>
<member><function>file_exists</function></member>
<member><function>function_exists</function></member>
</simplelist>
</para>
</sect2>
</sect1>
</chapter>
<!-- 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
-->