-
Notifications
You must be signed in to change notification settings - Fork 165
Expand file tree
/
Copy pathnumeric-strings.xml
More file actions
158 lines (150 loc) · 6.06 KB
/
numeric-strings.xml
File metadata and controls
158 lines (150 loc) · 6.06 KB
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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: pierrick Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Chaînes numériques</title>
<para>
Une chaîne de caractères PHP <type>string</type> est considérée comme numérique si elle peut être interprétée comme
un <type>int</type> ou un <type>float</type>.
</para>
<para>
Formellement à partir de 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>
PHP dispose également d'un concept de chaînes <emphasis>débutant</emphasis> numériquement.
Il s'agit simplement d'une chaîne qui commence comme une chaîne numérique suivie de
n'importe quel caractère.
</para>
<note>
<para>
Toute chaîne contenant la lettre <literal>E</literal> (insensible à la casse)
délimitée par des nombres sera considérée comme un nombre exprimé en notation scientifique.
Cela peut produire des résultats inattendus.
</para>
<example>
<title>Comparaisons avec notation scientifique</title>
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // false, "0D1" n'est pas en notation scientifique
var_dump("0E1" == "000"); // true, "0E1" est 0 * (10 ^ 1), soit 0
var_dump("2E1" == "020"); // true, "2E1" est 2 * (10 ^ 1), soit 20
?>
]]>
</programlisting>
</example>
</note>
<sect2 xml:id="language.types.numeric-string.conversion">
<title>Chaînes de caractères utilisées dans des contextes numériques</title>
<para>
Lorsqu'une <type>string</type> doit être évaluée comme un nombre (par exemple, opérations
arithmétiques, déclaration de type <type>int</type>, etc.),
les étapes suivantes sont suivies pour déterminer le résultat :
<orderedlist>
<listitem>
<simpara>
Si la <type>string</type> est numérique, elle est résolue en <type>int</type> si
la <type>string</type> est une chaîne numérique entière et entre dans les
limites du type <type>int</type> (telles que définies par
<constant>PHP_INT_MAX</constant>), sinon elle est résolue en un
<type>float</type>.
</simpara>
</listitem>
<listitem>
<simpara>
Si le contexte autorise les chaînes débutant numériquement et que la <type>string</type>
en est une, elle est résolue en <type>int</type> si la partie initiale de la chaîne
<type>string</type> est une chaîne numérique entière et entre dans les
limites du type <type>int</type> (telles que définies par
<constant>PHP_INT_MAX</constant>), sinon elle est résolue en un
<type>float</type>.
De plus, une erreur de niveau <constant>E_WARNING</constant> est soulevée.
</simpara>
</listitem>
<listitem>
<simpara>
Si la <type>string</type> n'est pas numérique, une <classname>TypeError</classname>
est lancée.
</simpara>
</listitem>
</orderedlist>
</para>
</sect2>
<sect2 xml:id="language.types.numeric-string.prior">
<title>Comportement antérieur à PHP 8.0.0</title>
<para>
Avant PHP 8.0.0, une <type>string</type> était considérée comme numérique seulement si elle
avait des espaces blancs en <emphasis>début</emphasis> de chaîne, si elle avait des espaces blancs
en <emphasis>fin</emphasis> de chaîne, la chaîne était considérée comme une chaîne débutant numériquement.
</para>
<para>
Avant PHP 8.0.0, lorsqu'une chaîne de caractères était utilisée dans un contexte numérique,
elle effectuait les mêmes étapes que ci-dessus, avec les différences suivantes :
<itemizedlist>
<listitem>
<simpara>
L'utilisation d'une chaîne de caractères débutant numériquement générait une erreur de type
<constant>E_NOTICE</constant> au lieu de <constant>E_WARNING</constant>.
</simpara>
</listitem>
<listitem>
<simpara>
Si la chaîne de caractères n'était pas numérique, une <constant>E_WARNING</constant>
était levée et la valeur <literal>0</literal> était retournée.
</simpara>
</listitem>
</itemizedlist>
Avant PHP 7.1.0, ni <constant>E_NOTICE</constant>
ni <constant>E_WARNING</constant> n'étaient levées.
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$foo = 1 + "10.5"; // $foo est un float (11.5)
$foo = 1 + "-1.3e3"; // $foo est un float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError à partir de PHP 8.0.0, $foo est un integer (1) auparavant
$foo = 1 + "bob3"; // TypeError à partir de PHP 8.0.0, $foo est un integer (1) auparavant
$foo = 1 + "10 Small Pigs"; // $foo est un integer (11) et une E_WARNING est levée à partir de PHP 8.0.0, E_NOTICE auparavant
$foo = 4 + "10.2 Little Piggies"; // $foo est un float (14.2) et une E_WARNING est levée à partir de PHP 8.0.0, E_NOTICE auparavant
$foo = "10.0 pigs " + 1; // $foo est un float (11) et une E_WARNING est levée à partir de PHP 8.0.0, E_NOTICE auparavant
$foo = "10.0 pigs " + 1.0; // $foo est un float (11) et une E_WARNING est levée à partir de PHP 8.0.0, E_NOTICE auparavant
?>
]]>
</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
-->