PHPCon Poland 2024

Chaînes numériques

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
?>

Chaînes de caractères utilisées dans des contextes numériques

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 :

  1. Si la string est numérique, elle est résolue en int si la string est une chaîne numérique entière et entre dans les limites du type int (telles que définies par PHP_INT_MAX), sinon elle est résolue en un float.
  2. Si le contexte autorise les chaînes débutant numériquement et que la string en est une, elle est résolue en int si la partie initiale de la chaîne string est une chaîne numérique entière et entre dans les limites du type int (telles que définies par PHP_INT_MAX), sinon elle est résolue en un float. De plus, une erreur de niveau E_WARNING est soulevée.
  3. Si la string n'est pas numérique, une TypeError est lancée.

Comportement antérieur à PHP 8.0.0

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 :

  • L'utilisation d'une chaîne de caractères débutant numériquement générait une erreur de type E_NOTICE au lieu de E_WARNING.
  • Si la chaîne de caractères n'était pas numérique, une E_WARNING était levée et la valeur 0 était retournée.
Antérieur à PHP 7.1.0, ni 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
?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top