is_numeric()
Функция is_numeric() в PHP проверяет, является ли переменная числом или числовой строкой, и возвращает boolean.
Введение
is_numeric() — встроенная PHP-функция, которая проверяет, является ли значение числом или числовой строкой. Последнее — главная причина её существования: PHP часто получает числа в виде строк из полей форм, параметров запроса, JSON, CSV-файлов — и вам нужен надёжный способ спросить «можно ли это трактовать как число?» перед выполнением арифметических операций. is_numeric() отвечает именно на этот вопрос и возвращает boolean.
На этой странице рассмотрены синтаксис, что считается числовым (и что неожиданно таковым не является), отличие от is_int() и is_float(), а также практический паттерн валидации входных данных.
Синтаксис
is_numeric(mixed $value): boolФункция принимает один аргумент $value и возвращает true, если $value является числом или числовой строкой, и false в противном случае. Она никогда не выбрасывает исключений и не изменяет свой аргумент.
Базовый пример
$var1 — строка "42", $var2 — float 3.14, $var3 — строка "hello". Первые два являются числовыми, поэтому is_numeric() возвращает true; третье — нет.
Совет: Используйте
var_dump()вместоechoпри тестировании boolean-значений.echoвыводитtrueкак"1", аfalseкак пустую строку — это легко неправильно интерпретировать.var_dump()выводитbool(true)/bool(false), поэтому результат однозначен.
Что считается числовым
Строка является числовой, если она представляет корректное целое число или число с плавающей точкой в десятичной или научной нотации. Это включает ведущий знак, ведущую или завершающую десятичную точку, окружающие пробелы и показатели степени:
<?php
var_dump(is_numeric("1e3")); // bool(true) — scientific notation (1000)
var_dump(is_numeric("+42")); // bool(true) — leading sign
var_dump(is_numeric("-0.5")); // bool(true) — negative float
var_dump(is_numeric(".5")); // bool(true) — leading decimal point
var_dump(is_numeric(" 42")); // bool(true) — leading whitespace
var_dump(is_numeric("0x1A")); // bool(false) — hex strings are NOT numeric (since PHP 7)
var_dump(is_numeric("0b101")); // bool(false) — binary strings are not numeric
var_dump(is_numeric("")); // bool(false) — empty string
var_dump(is_numeric("42px")); // bool(false) — trailing non-numeric characters
?>Типичные подводные камни:
- Шестнадцатеричные и двоичные строки возвращают
false."0x1A"считалось числовым до PHP 7, но теперь нет. Числовые литералы, записанные в коде (например,0x1A), уже являются настоящими целыми числами, поэтомуis_numeric()видит обычный int и возвращаетtrue. - Завершающая единица измерения делает всю строку нечисловой.
"42px"— этоfalse. Если нужно извлечь число из такой строки, используйте вместо этого приведение(int)илиfilter_var(). - Ведущие/завершающие пробелы допустимы (завершающие пробелы стали допускаться в PHP 8.0).
is_numeric() против is_int() и is_float()
Эти три функции легко перепутать. Разница в том, важен ли тип или только значение:
<?php
$value = "10"; // a string that looks like a number
var_dump(is_numeric($value)); // bool(true) — value can be a number
var_dump(is_int($value)); // bool(false) — type is string, not int
var_dump(is_float($value)); // bool(false) — type is string, not float
?>is_numeric()учитывает значение: «может ли это быть числом?» Она принимает числовые строки.is_int()иis_float()учитывают объявленный тип: они возвращаютtrueтолько для настоящегоintилиfloat, но никогда для строки.
Используйте is_numeric() при валидации входных данных, которые приходят в виде текста; используйте is_int() / is_float(), когда вам действительно нужно знать тип переменной.
Практическое применение: валидация входных данных перед математикой
Типичная задача is_numeric() в реальных проектах — защита арифметических операций над недоверенными входными данными, чтобы избежать TypeError или неявных нулей:
<?php
$inputs = ["100", "12.5", "5e2", "abc", "12px", ""];
foreach ($inputs as $in) {
if (is_numeric($in)) {
echo "$in is numeric -> " . ($in + 0) . "\n";
} else {
echo "$in is NOT numeric\n";
}
}
// 100 is numeric -> 100
// 12.5 is numeric -> 12.5
// 5e2 is numeric -> 500
// abc is NOT numeric
// 12px is NOT numeric
// is NOT numeric
?>Добавление + 0 (или приведение через (int) / (float)) преобразует проверенную строку в настоящее число, как только вы убедились, что это безопасно. Для более строгой валидации — например, чтобы принимать только целые числа или применять диапазон — комбинируйте это с filter_var() и фильтрами FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT.
Заключение
is_numeric() надёжно определяет, можно ли значение — включая строку — трактовать как число, что делает её правильным защитником перед выполнением арифметики над данными из форм, URL или файлов. Помните, что она возвращает false для шестнадцатеричных/двоичных строк и для любой строки с нечисловыми завершающими символами, а также что она проверяет значение, а не тип — используйте is_int() или is_float(), когда важен объявленный тип. Смотрите также gettype() и PHP Data Types для более широкого контекста.