Строка 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 и т. д.), для определения результата предпринимаются следующие шаги:

  1. Если строка является числовой, разрешается в int , если строка является целочисленной числовой строкой и соответствует ограничениям типа int (как определено PHP_INT_MAX), в противном случае разрешается в float .
  2. Если контекст допускает начальные числовые строки, а строка равна единице, разрешается в int , если ведущая часть строки является целочисленной числовой строкой и соответствует ограничениям типа int (как определено в PHP_INT_MAX), в противном случае разрешается в число с плавающей запятой . . Дополнительно выдается ошибка уровня E_WARNING.
  3. Строка не является числовой, выдайте 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
?>