-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathnumeric-strings.xml
166 lines (157 loc) · 6.01 KB
/
numeric-strings.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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 7ba2406e555a240338d63f72d9ac54a46e0bee5d Maintainer: samesch Status: ready -->
<!-- Reviewed: no -->
<!-- $Revision$ -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Numerische Zeichenketten</title>
<para>
In PHP gilt eine Zeichenkette (Typ <type>string</type>) als numerisch, wenn
er als Ganzzahl (<type>int</type>) oder Gleitkommazahl (<type>float</type>)
interpretiert werden kann.
</para>
<para>
Formal seit PHP 8.0.0:
</para>
<informalexample>
<programlisting>
<![CDATA[
WHITESPACES \s*
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
]]>
</programlisting>
</informalexample>
<para>
In PHP gibt es auch das Konzept der <emphasis>vorangestellten</emphasis>
numerischen Zeichenkette. Dies ist einfach eine Zeichenkette, die wie eine
numerische Zeichenkette beginnt, auf die beliebige Zeichen folgen.
</para>
<note>
<para>
Jede Zeichenkette, die den Buchstaben <literal>E</literal> (Groß- und
Kleinschreibung wird nicht berücksichtigt) enthält, wird als Zahl in
wissenschaftlicher Notation betrachtet. Dies kann zu unerwarteten
Ergebnissen führen.
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // false, "0D1" ist keine wissenschaftliche Schreibweise
var_dump("0E1" == "000"); // true, "0E1" ist 0 * (10 ^ 1) also 0
var_dump("2E1" == "020"); // true, "2E1" ist 2 * (10 ^ 1) also 20
?>
]]>
</programlisting>
</para>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
<title>Zeichenketten, die im numerischen Kontext verwendet werden</title>
<para>
Wenn ein Wert vom Typ <type>string</type> als Zahl ausgewertet werden muss
(&zb; arithmetische Operationen, Deklaration des Typs <type>int</type>
usw.), werden die folgenden Schritte durchgeführt, um das Ergebnis zu
ermitteln:
<orderedlist>
<listitem>
<simpara>
Wenn der <type>String</type> numerisch ist, wird er in einen
<type>Int</type> aufgelöst, sofern er eine ganzzahlige numerische
Zeichenkette ist und gemäß der Definition von
<constant>PHP_INT_MAX</constant> innerhalb der Grenzen des Typs
<type>int</type> liegt, ansonsten wird er in einen <type>Float</type>
aufgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn der Kontext vorangestellte numerische Zeichenketten erlaubt und der
<type>String</type> eine solche ist, wird in einen <type>Int</type>
aufgelöst, sofern der vorangestellte Teil des <type>String</type>s eine
ganzzahlige numerische Zeichenkette ist und gemäß der Definition von
<constant>PHP_INT_MAX</constant> innerhalb der Grenzen des Typs
<type>int</type> liegt, ansonsten wird in einen <type>Float</type>
aufgelöst. Darüber hinaus wird ein Fehler der Stufe
<constant>E_WARNING</constant> ausgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn der <type>String</type> nicht numerisch ist, wird eine
<classname>TypeError</classname>-Exception geworfen.
</simpara>
</listitem>
</orderedlist>
</para>
</sect2>
<sect2 xml:id="language.types.numeric-string.prior">
<title>Verhalten vor PHP 8.0.0</title>
<para>
Vor PHP 8.0.0 galt ein <type>String</type> nur dann als numerisch, wenn er
ein <emphasis>vorangestelltes</emphasis> Leerzeichen enthielt. Wenn er ein
<emphasis>nachgestelltes</emphasis> Leerzeichen enthielt, wurde er als
vorangestellt numerisch betrachtet.
</para>
<para>
Wenn vor PHP 8.0.0 eine Zeichenkette in einem numerischen Kontext verwendet
wurde, wurden die gleichen Schritte wie oben beschrieben durchgeführt, mit
den folgenden Unterschieden:
<itemizedlist>
<listitem>
<simpara>
Bei Verwendung einer führenden numerischen Zeichenkette wurde ein
<constant>E_NOTICE</constant> anstelle eines
<constant>E_WARNING</constant> ausgelöst.
</simpara>
</listitem>
<listitem>
<simpara>
Wenn die Zeichenkette nicht numerisch war, wurde ein
<constant>E_WARNING</constant> ausgelöst und der Wert
<literal>0</literal> zurückgegeben.
</simpara>
</listitem>
</itemizedlist>
Vor PHP 7.1.0 wurde weder <constant>E_NOTICE</constant> noch
<constant>E_WARNING</constant> ausgelöst.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 1 + "10.5"; // $foo ist vom Typ float (11.5)
$foo = 1 + "-1.3e3"; // $foo ist vom Typ float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "bob3"; // TypeError seit PHP 8.0.0; davor ist $foo vom Typ integer (1)
$foo = 1 + "10 Small Pigs"; // $foo ist vom Typ integer (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo ist vom Typ float (14.2) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo ist vom Typ float (11) und in PHP 8.0.0 wird ein E_WARNING ausgelöst; davor E_NOTICE
?>
]]>
</programlisting>
</informalexample>
</sect2>
</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
-->