Numeriska strängar

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Numeriska strängar

En PHP-sträng anses vara numerisk om den kan tolkas som en heltal (int) eller ett flyttal (float).

Formellt från och med 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 har också ett koncept av ledande numeriska strängar. Detta är helt enkelt en sträng som börjar som en numerisk sträng följt av vilka karaktärer som helst.

Observera:

Varje sträng som innehåller bokstaven E (okänslig för gemener eller versaler) omgiven av siffror ses som ett tal uttryckt i vetenskaplig notation. Detta kan ge oväntade resultat.

var_dump("0D1" == "000"); // false, "0D1" är inte vetenskaplig notation
var_dump("0E1" == "000"); // true, "0E1" är 0 * (10 ^ 1), eller 0
var_dump("2E1" == "020"); // true, "2E1" är 2 * (10 ^ 1), eller 20

Strängar används i numeriska sammanhang

När en sträng behöver utvärderas som ett tal (t.ex. vid aritmetiska operationer, int-typdeklarationer etc.) tas följande steg för att bestämma resultatet:

  • Om strängen är numerisk, lös till en int om strängen är en heltalsnumerisk sträng och passar inom gränserna för int-typgränserna (som definieras av PHP_INT_MAX), annars lös till en float.
  • Om sammanhanget tillåter ledande numeriska strängar och strängen är en sådan, lös till en int om den ledande delen av strängen är en heltalsnumerisk sträng och passar inom gränserna för int-typgränserna (som definieras av PHP_INT_MAX), annars lös till en float. Dessutom utlöses ett fel av nivå E_WARNING.
  • Om strängen inte är numerisk, kasta ett TypeError.

Beteende före PHP 8.0.0

Före PHP 8.0.0 ansågs en sträng vara numerisk endast om den hade ledande blanksteg. Om den hade efterföljande blanksteg ansågs strängen vara ledande numerisk.

Före PHP 8.0.0, när en sträng användes i ett numeriskt sammanhang, skulle samma steg utföras som ovan med följande skillnader:

  • Användningen av en ledande numerisk sträng skulle utlösa ett E_NOTICE istället för ett E_WARNING.
  • Om strängen inte är numerisk, utlöstes ett E_WARNING och värdet 0 returnerades.
  • Före PHP 7.1.0, utlöstes varken E_NOTICE eller E_WARNING.
$foo = 1 + "10.5";                // $foo är float (11.5)
$foo = 1 + "-1.3e3";              // $foo är float (-1299)
$foo = 1 + "bob-1.3e3";           // TypeError från och med PHP 8.0.0, $foo är integer (1) tidigare
$foo = 1 + "bob3";                // TypeError från och med PHP 8.0.0, $foo är integer (1) tidigare
$foo = 1 + "10 Small Pigs";       // $foo är integer (11) och ett E_WARNING utlöses i PHP 8.0.0, E_NOTICE tidigare
$foo = 4 + "10.2 Little Piggies"; // $foo är float (14.2) och ett E_WARNING utlöses i PHP 8.0.0, E_NOTICE tidigare
$foo = "10.0 pigs " + 1;          // $foo är float (11) och ett E_WARNING utlöses i PHP 8.0.0, E_NOTICE tidigare
$foo = "10.0 pigs " + 1.0;        // $foo är float (11) och ett E_WARNING utlöses i PHP 8.0.0, E_NOTICE tidigare

PHP Språkreferens