Строка PHP считается числовой, если ее можно интерпретировать как int или float .
Формально с PHP 8.0.0:
ПРОБЕЛЫ \s*
ЛЧИСЛО [0-9]+
DNUM ([0-9]*)[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {ПРОБЕЛЫ}
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {ПРОБЕЛЫ}
NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
PHP также имеет концепцию начальных числовых строк. Это просто строка, которая начинается как числовая строка, за которой следуют любые символы.
Строки, используемые в числовых контекстах
Когда строку необходимо оценить как число (например, арифметические операции, объявление типа int и т. д.), для определения результата предпринимаются следующие шаги:
- Если строка является числовой, разрешается в int , если строка является целочисленной числовой строкой и соответствует ограничениям типа int (как определено
PHP_INT_MAX
), в противном случае разрешается в float . - Если контекст допускает начальные числовые строки, а строка равна единице, разрешается в int , если ведущая часть строки является целочисленной числовой строкой и соответствует ограничениям типа int (как определено в
PHP_INT_MAX
), в противном случае разрешается в число с плавающей запятой . . Дополнительно выдается ошибка уровняE_WARNING
. - Строка не является числовой, выдайте TypeError .
Поведение до PHP 8.0.0
До PHP 8.0.0 строка считалась числовой только в том случае, если в ней были начальные пробелы. Если в ней были конечные пробелы, строка считалась ведущей числовой.
До PHP 8.0.0, когда строка использовалась в числовом контексте, выполнялись те же действия, что и выше, со следующими отличиями:
- Использование ведущей числовой строки вызовет
E_NOTICE
вместоE_WARNING
. - Если строка не является числовой,
E_WARNING
было поднято и значение0
будет возвращено.
До PHP 7.1.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
?>
0 комментариев