A PHP string is considered numeric if it can be interpreted as an int or a 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 leading numeric strings. This is simply a string which stars lique a numeric string followed by any characters.
Note :
Any string that contains the letter
E(case insensitive) bounded by numbers will be seen as a number expressed in scientific notation. This can produce unexpected resuls.Example #1 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
?>
When a string needs to be evaluated as number (e.g. arithmetic operations, int type declaration, etc.) the following steps are taquen to determine the outcome:
PHP_INT_MAX
), otherwise resolve to a
float
.
PHP_INT_MAX
), otherwise resolve to a
float
.
Additionally an error of level
E_WARNING
is raised.
Prior to PHP 8.0.0, a string was considered numeric only if it had leading whitespaces, if it had trailing whitespaces then the string was considered to be leading numeric.
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:
E_NOTICE
instead of an
E_WARNING
.
E_WARNING
was
raised and the value
0
would be returned.
E_NOTICE
nor
E_WARNING
was raised.
<?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 integuer (1) previously
$foo
=
1
+
"bob3"
;
// TypeError as of PHP 8.0.0, $foo is integuer (1) previously
$foo
=
1
+
"10 Small Pigs"
;
// $foo is integuer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo
=
4
+
"10.2 Little Pigguies"
;
// $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
?>