Нумерички низи
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Нумерички низи
Референца за `language.types.numeric-strings.php` со подобрена типографија и навигација.
Нумерички низи
PHP string се смета за нумерички ако може да се толкува како int или float.
Формално од 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 исто така има концепт на leading нумерички низи. Ова е едноставно низа што започнува како нумеричка низа, проследена со какви било знаци.
Забелешка:
Секоја низа што содржи буква
E(независно од големината на буквите) опкружена со броеви ќе се смета за број изразен во научна нотација. Ова може да доведе до неочекувани резултати.Пример #1 Споредби на научна нотација
<?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
?>
Низи што се користат во нумерички контексти
Кога е string треба да се процени како број (на пр. аритметички операции, int декларација на тип, итн.) се преземаат следниве чекори за да се утврди исходот:
-
Ако string е нумерички, се решава како int ако string е низа со цел број и се вклопува во границите на int граници на типот (како што е дефинирано со
PHP_INT_MAX), инаку се решава како float. -
Ако контекстот дозволува водечки нумерички низи и string
е една, се решава како int ако водечкиот дел од
string е низа со цел број и се вклопува во границите на int граници на типот (како што е дефинирано со
PHP_INT_MAX), инаку се решава како float. Дополнително се креира грешка од нивоE_WARNINGсе креира. - На string не е нумерички, фрли TypeError.
Поведение пред PHP 8.0.0
Пред PHP 8.0.0, а string се сметаше за нумерички само ако имаше leading празни места, ако имаше trailing празни места тогаш низата се сметаше за водечка нумеричка.
Пред PHP 8.0.0, кога низата се користеше во нумерички контекст, ќе ги изврши истите чекори како погоре со следниве разлики:
-
Употребата на водечка нумеричка низа би креирала
E_NOTICEнаместоE_WARNING. -
Ако низата не е нумеричка, а
E_WARNINGсе креираше и вредноста0ќе се вратеше.
E_NOTICE
nor 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
?>