Числовые строки
В 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} [+-]? {EXPONENT_DNUM} {WHITESPACES} NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
В PHP также присутствует концепция префиксной числовой строки. Это строка, которая начинается как числовая и продолжается любыми другими символами.
Строки, используемые в числовых контекстах
Когда строку необходимо использовать в качестве числа (например арифметические операции, декларация целочисленного типа, и т.д.), используется следующий алгоритм действий:
-
Если строка числовая, представляет целое число и не превышает максимально
допустимого значения для типа int (определённого в
PHP_INT_MAX
), то она приводится к типу int. Иначе она приводится к типу float. -
Если в заданном контексте дозволительно использовать префиксную числовую строку, то,
если начало строки представляет целое число и не превышает максимально
допустимого значения для типа int (определённого в
PHP_INT_MAX
), то она приводится к типу int. Иначе она приводится к типу float. Также, в этом случае, выдаётся ошибка уровняE_WARNING
. - Если строка не числовая - выбрасывается исключение TypeError.
Поведение до PHP 8.0.0
До PHP 8.0.0, строка считалась числовой только в случае, если она начиналась с пробельных символов. Если она завершалась пробельными символами - она считалась префиксной числовой.
До PHP 8.0.0, когда строку необходимо использовать как число, использовался тот же алгоритм, что и описан выше, но с некоторыми отличиями:
-
Использование префиксной числовой строки вызывало ошибку уровня
E_NOTICE
, а неE_WARNING
. -
Если строка не являлась числовой, вызывалась ошибка уровня
E_WARNING
, а сама строка приводилась к числу0
.
<?php
$foo = 1 + "10.5"; // $foo считается за число с плавающей запятой (11.5)
$foo = 1 + "-1.3e3"; // $foo считается за число с плавающей запятой (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError начиная с PHP 8.0.0. В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "bob3"; // TypeError начиная с PHP 8.0.0, В более ранних версиях $foo считалось за целое число (1)
$foo = 1 + "10 Small Pigs"; // $foo - целое (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo - число с плавающей запятой (14.2). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1; // $foo - число с плавающей запятой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo - число с плавающей запятой (11). В PHP 8.0.0 создаётся ошибка уровня E_WARNING, а в более ранних версиях уровня E_NOTICE
?>