is_finite()
Разбираем функцию is_finite() в PHP: что считается конечным числом, как функция обрабатывает нечисловые значения и когда её применять.
Функция is_finite() в PHP проверяет, является ли число конечным — то есть обычным числом, которое не является бесконечностью (INF / -INF) или NAN (не числом). На этой странице объясняется, что считается конечным, как функция обрабатывает нечисловые значения и когда она пригодится в реальном коде.
Синтаксис
is_finite(float $num): bool$num— проверяемое значение. Обрабатывается какfloat; числовые строки и целые числа преобразуются автоматически.- Возвращаемое значение —
true, если$numявляется конечным числом;false, если этоINF,-INFилиNAN.
Почему «конечность» важна
Арифметика с плавающей точкой может порождать специальные значения, которые не являются обычными числами:
INFи-INFпоявляются, когда результат выходит за пределы диапазонаfloat(например, при делении на ноль с числами с плавающей точкой или приPHP_FLOAT_MAX * 2).NANпоявляется при неопределённых операциях, таких какsqrt(-1)илиINF - INF.
Эти значения незаметно распространяются через последующие вычисления и нарушают сравнения (NAN == NAN даже возвращает false). Функция is_finite() позволяет обнаружить их до того, как они испортят результат.
Простой пример
Здесь переменной присваивается обычное число и выводится The number is a finite number, поскольку 10 является конечным числом.
Поведение для разных значений
Пример ниже показывает, что возвращает is_finite() для распространённых граничных случаев:
<?php
var_dump(is_finite(10)); // bool(true) — a normal integer
var_dump(is_finite(3.14)); // bool(true) — a normal float
var_dump(is_finite("42")); // bool(true) — numeric string is cast to float
var_dump(is_finite(PHP_FLOAT_MAX)); // bool(true) — large but still finite
var_dump(is_finite(INF)); // bool(false) — positive infinity
var_dump(is_finite(-INF)); // bool(false) — negative infinity
var_dump(is_finite(PHP_FLOAT_MAX * 2));// bool(false) — overflows to INF
var_dump(is_finite(NAN)); // bool(false) — Not a Number
?>Обратите внимание: is_finite() не проверяет, является ли значение числом — она сначала выполняет приведение типов. is_finite("hello") превращается в is_finite(0.0) и возвращает true. Если нужно убедиться, что значение действительно является числом, сначала проверьте его с помощью is_numeric().
Практический пример
Распространённый паттерн — защита вычисления, которое может переполниться до INF:
<?php
function safeSquare($x) {
$result = $x * $x;
// If the multiplication overflows, $result becomes INF.
return is_finite($result) ? $result : null;
}
var_dump(safeSquare(3.0)); // float(9)
var_dump(safeSquare(PHP_FLOAT_MAX)); // NULL — squaring overflows to INF
?>Здесь safeSquare() возвращает null вместо того, чтобы позволить INF проникнуть в остальную часть программы, — это даёт вызывающему коду возможность корректно обработать ошибку. (Обратите внимание: в PHP 8+ деление целых или дробных чисел на ноль выбрасывает DivisionByZeroError, а не возвращает INF, поэтому переполнение — типичный способ получить бесконечный результат.)
Связанные функции
is_infinite()— обратная проверка: возвращаетtrueдляINF/-INF.is_nan()— проверяет конкретно наNAN.is_numeric()— проверяет, является ли значение числом или числовой строкой, перед выполнением математических операций.is_float()— проверяет, имеет ли переменная типfloat.
Заключение
is_finite() — небольшая, но важная защита при работе с арифметикой с плавающей точкой в PHP. Она возвращает true только для обычных чисел и false для INF, -INF и NAN, позволяя перехватывать переполнение и неопределённые результаты до их распространения. Используйте её вместе с is_numeric() для валидации входных данных, а также с is_infinite() / is_nan(), когда нужно точно определить, какое специальное значение вы получили.