-
Notifications
You must be signed in to change notification settings - Fork 157
/
Copy pathnumeric-strings.xml
155 lines (147 loc) · 5.9 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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 7ba2406e555a240338d63f72d9ac54a46e0bee5d 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.
<programlisting role="php">
<![CDATA[
<?php
var_dump("0D1" == "000"); // false, "0D1" is not scientific notation
var_dump("0E1" == "000"); // true, "0E1" is 0 * (10 ^ 1), or 0
var_dump("2E1" == "020"); // true, "2E1" is 2 * (10 ^ 1), or 20
?>
]]>
</programlisting>
</para>
</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>
Antérieur à 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>
Antérieur à 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>
Antérieur à 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 is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "bob3"; // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "10 Small Pigs"; // $foo is integer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1; // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1.0; // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
?>
]]>
</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
-->