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.Exemple #1 Comparaisons avec notation scientifique
<?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
?>
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.
Avant 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.
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 :
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 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
?>