Numeric strings
Numeric strings
A PHP is considered numeric if it can be interpreted as
an or a .
string``int``float
Formally as of 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 also has a concept of numeric strings. This is simply a string which starts like a numeric string followed by any characters. leading
Opmerking: > Any string that contains the letter (case insensitive) bounded by numbers will be seen as a number expressed in scientific notation. This can produce unexpected results.
EVoorbeeld: Scientific Notation Comparisons
<?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 ?>
Strings used in numeric contexts
When a needs to be evaluated as number (e.g. arithmetic operations, type declaration, etc.) the following steps are taken to determine the outcome:
string``int1. If the is numeric, resolve to an if the is an integer numeric string and fits into the limits of the type limits (as defined by ), otherwise resolve to a . string``int``string``int``PHP_INT_MAX``float
2. If the context allows leading numeric strings and the is one, resolve to an if the leading part of the is an integer numeric string and fits into the limits of the type limits (as defined by ), otherwise resolve to a . Additionally an error of level is raised. string``int``string``int``PHP_INT_MAX``float``E_WARNING
3. The is not numeric, throw a . string``TypeError
Behavior prior to PHP 8.0.0
Prior to PHP 8.0.0, a was considered numeric only if it
had whitespaces, if it had
whitespaces then the string was considered to
be leading numeric.
stringleading**trailing
Prior to PHP 8.0.0, when a string was used in a numeric context it would perform the same steps as above with the following differences:
Prior to PHP 7.1.0, neither nor was raised.
- The usage of a leading numeric string would raise an instead of an .
E_NOTICE``E_WARNING - If the string is not numeric, an was raised and the value would be returned.
E_WARNING``0
E_NOTICE``E_WARNING
<?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
?>