Une chaîne de caractères PHP string est considérée comme numérique si elle peut être interprétée comme un int ou un float.
Formellement à partir de PHP 8.0.0 :
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})
PHP dispose également d'un concept de chaînes débutant 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.
Note:
Toute chaîne contenant la lettre
E
(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.<?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
?>
Lorsqu'une string doit être évaluée comme un nombre (par exemple, opérations arithmétiques, déclaration de type int, etc.), les étapes suivantes sont suivies pour déterminer le résultat :
PHP_INT_MAX
), sinon elle est résolue en un
float.
PHP_INT_MAX
), sinon elle est résolue en un
float.
De plus, une erreur de niveau E_WARNING
est soulevée.
Antérieur à PHP 8.0.0, une string était considérée comme numérique seulement si elle avait des espaces blancs en début de chaîne, si elle avait des espaces blancs en fin de chaîne, la chaîne était considérée comme une chaîne débutant numériquement.
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 :
E_NOTICE
au lieu de E_WARNING
.
E_WARNING
était levée et la valeur 0
était retournée.
E_NOTICE
ni E_WARNING
n'étaient levées.
<?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
?>