Проверка типов значений в языке PHP: подробное руководство

Раздел: Основы PHP -> Проверка типов и значений в PHP

Основной способ: функция gettype()

Как получить строковое представление типа любой переменной?

Функция gettype() принимает одно значение и возвращает строку с названием типа: integer, double, string, array, object, resource, resource (closed), NULL, boolean или unknown type.


$var = 42;
echo gettype($var); // integer
$var = 3.14;
echo gettype($var); // double
$var = 'Привет';
echo gettype($var); // string
$var = [1, 2, 3];
echo gettype($var); // array
$var = null;
echo gettype($var); // NULL
  

определить тип php (определение типа переменной в php (gettype, is_*))

Функция удобна для отладки и быстрой проверки. Она не требует знания конкретных типов заранее. Однако результат gettype() для логических значений возвращает boolean, а для чисел с плавающей точкой – double (не float). Это историческое поведение.

Типичная ошибка:

Передача в gettype() неопределённой переменной вызывает предупреждение уровня E_WARNING и возвращает NULL (с PHP 8.0 – возвращает false?). На PHP 8.0+ gettype() генерирует TypeError для неопределённых переменных. Лучше предварительно проверять существование переменной через isset().

Цель использования: получение строки типа для вывода, логирования или сравнения с ожидаемым типом. Применяется, когда нужно универсально определить тип без привязки к конкретным проверкам.

Как проверить, является ли переменная целым числом (int)?

Функция is_int() (также is_integer(), is_long()) возвращает true, если значение имеет тип integer.


$value = 100;
if (is_int($value)) {
    echo 'Это целое число';
}
// Вывод: Это целое число
  

Php определить число (проверка, является ли переменная числом (int, float) в php)


$value = '100'; // строка
if (is_int($value)) {
    echo 'Целое число'; // не выполнится
} else {
    echo 'Не целое число';
}
// Вывод: Не целое число
  

Php определить массив (проверка, является ли переменная массивом в php)

Проблема:

Строка, содержащая число, не будет распознана как int. Для проверки числового содержимого строки используйте is_numeric() или ctype_digit().

Цель использования: точная проверка на тип integer. Применяется, когда критично, чтобы значение было именно числовым типом, а не строкой.

Как проверить, является ли значение числом (включая строковое представление)?

Функция is_numeric() возвращает true для чисел (int, float) и строк, содержащих допустимое числовое представление (например, '123', '3.14', '0xff', '+1.2e3').


$test = '123.45';
var_dump(is_numeric($test)); // bool(true)
$test = 'abc';
var_dump(is_numeric($test)); // bool(false)
$test = 0x1A;
var_dump(is_numeric($test)); // bool(true) – это integer
  

Типичная ошибка:

Пустая строка '' не является числовой, is_numeric('') вернёт false. Также строка ' 123' с пробелами может восприниматься как число (зависит от контекста, но is_numeric вернёт false). Для проверки на валидность числа в пользовательском вводе часто используют filter_var() с FILTER_VALIDATE_FLOAT или FILTER_VALIDATE_INT.

Цель использования: определить, может ли значение быть преобразовано в число без потери данных. Полезно при обработке данных из форм или файлов.

Как проверить, является ли переменная строкой?

Функция is_string() возвращает true, если тип переменной – string.


$name = 'Alice';
var_dump(is_string($name)); // bool(true)
$number = 42;
var_dump(is_string($number)); // bool(false)
  

Цель использования: явная проверка типа перед операциями, требующими строку (например, конкатенация, работа с регулярными выражениями).

Как проверить, является ли переменная массивом?

Функция is_array() возвращает true для любого массива (включая пустой).


$arr = ['a' => 1];
var_dump(is_array($arr)); // bool(true)
$obj = new stdClass;
var_dump(is_array($obj)); // bool(false)
  

Цель использования: безопасное выполнение операций с массивами (циклы, доступ по ключу).

Как проверить, является ли переменная объектом?

Функция is_object() возвращает true, если значение – объект.


$object = new DateTime();
var_dump(is_object($object)); // bool(true)
  

Цель использования: проверка перед вызовом методов объекта или передачей в функции, ожидающие объект.

Как проверить, является ли значение NULL?

Функция is_null() – синоним проверки $var === null.


$var = null;
var_dump(is_null($var)); // bool(true)
  

Цель использования: проверка на отсутствие значения. Отличается от isset(), которая также проверяет существование переменной.

Как проверить, является ли переменная скалярным типом (int, float, string, bool)?

Функция is_scalar() возвращает true для integer, float, string, boolean. Для массивов, объектов, ресурсов и null – false.


$val = 'hello';
var_dump(is_scalar($val)); // bool(true)
$val = [1,2];
var_dump(is_scalar($val)); // bool(false)
  

Цель использования: проверка, является ли значение простым «скалярным» типом, пригодным для вывода или передачи в функции, ожидающие простые данные.

Как проверить, можно ли вызвать значение как функцию?

Функция is_callable() проверяет, является ли переменная именем функции, методом объекта или замыканием, которое можно вызвать.


$closure = function() { return 'ok'; };
var_dump(is_callable($closure)); // bool(true)
var_dump(is_callable('strlen')); // bool(true)
var_dump(is_callable('undefined_func')); // bool(false)
  

Проблема:

is_callable() может вернуть true для приватных методов, если вызов происходит из того же класса. Для внешних проверок используйте третий параметр для получения имени вызываемого.

Цель использования: динамический вызов функций или методов, реализация callback-механизмов.

Как проверить, является ли значение итерируемым (массив или Traversable)?

Функция is_iterable() (доступна с PHP 7.1) возвращает true для массивов и объектов, реализующих интерфейс Traversable.


$array = [1,2,3];
var_dump(is_iterable($array)); // bool(true)
$iterator = new ArrayIterator([1,2]);
var_dump(is_iterable($iterator)); // bool(true)
  

Цель использования: безопасный foreach или передача в функции, ожидающие итерируемый аргумент (тип iterable).

Как проверить тип ресурса (устаревший способ)?

Функция is_resource() проверяет, является ли значение ресурсом (например, открытый файл, соединение с БД).


$file = fopen('/tmp/test.txt', 'r');
var_dump(is_resource($file)); // bool(true)
fclose($file);
var_dump(is_resource($file)); // bool(false) – теперь closed resource
  

Примечание:

Начиная с PHP 8.0 ресурсы являются устаревшими, и многие функции возвращают объекты вместо ресурсов. Используйте is_resource() только для обратной совместимости.

Цель использования: в старом коде для проверки, успешно ли открыт ресурс.

Общие проблемы и советы

  • Не путайте is_int() и is_numeric(): первая проверяет только тип integer, вторая – числовое содержимое.
  • Для проверки boolean используйте is_bool() – функция из того же семейства.
  • gettype() для логических значений возвращает строку 'boolean', для float – 'double', не путайте.
  • При использовании строгой типизации (declare(strict_types=1)) функции is_* продолжают работать как обычно, но типы аргументов начинают проверяться строже при вызове пользовательских функций.

Расширенные примеры с gettype и is_*

Пример 1. Комбинирование gettype и is_* для обработки неизвестного ввода.

Пример

function analyze($value) {
    $type = gettype($value);
    if ($type === 'integer') {
        // дополнительная проверка is_int для уверенности
        return 'Целое число: ' . $value;
    }
    if ($type === 'string') {
        if (is_numeric($value)) {
            return 'Строка, содержащая число: ' . $value;
        }
        return 'Простая строка: ' . $value;
    }
    if (is_iterable($value)) {
        return 'Итерируемый объект: ' . count($value) . ' элементов';
    }
    return 'Неизвестный тип: ' . $type;
}
echo analyze(42);         // Целое число: 42
echo analyze('123');       // Строка, содержащая число: 123
echo analyze('hello');     // Простая строка: hello
echo analyze([1,2]);       // Итерируемый объект: 2 элементов
  
Целое число: 42
Строка, содержащая число: 123
Простая строка: hello
Итерируемый объект: 2 элементов
  

Пример 2. Проверка на callable с использованием is_callable для динамического вызова.

Пример

$callbacks = [
    'strtoupper',
    function($x) { return $x * 2; },
    [new DateTime(), 'format'],
];
foreach ($callbacks as $cb) {
    if (is_callable($cb)) {
        echo 'Вызов: ' . (is_string($cb) ? $cb : 'closure/array') . ' -> ';
        if (is_array($cb)) {
            echo call_user_func($cb, 'Y-m-d'); // формат даты
        } else {
            echo call_user_func($cb, 'hello');
        }
        echo "\n";
    }
}
  
Вызов: strtoupper -> HELLO
Вызов: closure/array -> 20
Вызов: closure/array -> 2025-04-11
  

Пример 3. Строгая типизация и проверка типов через is_int.

Пример

declare(strict_types=1);

function multiply(int $a, int $b): int {
    return $a * $b;
}

$values = [5, '5'];
foreach ($values as $v) {
    if (is_int($v)) {
        echo multiply($v, 2) . "\n";
    } else {
        echo "Пропускаем, так как $v не целое число\n";
    }
}
  
10
Пропускаем, так как 5 не целое число
  

Пример 4. is_iterable с пользовательским итератором.

Пример

class MyCollection implements IteratorAggregate {
    private $items = ['a', 'b', 'c'];
    public function getIterator(): Traversable {
        return new ArrayIterator($this->items);
    }
}

$obj = new MyCollection;
var_dump(is_iterable($obj)); // true
$resource = fopen('php://memory', 'r');
var_dump(is_iterable($resource)); // false (ресурс не итерируем)
  
bool(true)
bool(false)
  

Пример 5. Обработка ошибок при использовании gettype с неопределённой переменной (рекомендуется для PHP 7.4 и ниже).

Пример

// В PHP < 8.0:
$undef = null;
// Лучше предварительно проверить isset
if (isset($undef)) {
    echo gettype($undef);
} else {
    echo 'Переменная не определена';
}
// В PHP 8.0+ gettype($undef) выбросит TypeError, поэтому нужно использовать @ или проверку
  
Переменная не определена
  

Пример 6. is_resource с закрытым ресурсом (устаревшее поведение).

Пример

$handle = fopen('/tmp/example.txt', 'w');
fwrite($handle, 'test');
fclose($handle);
// После закрытия is_resource возвращает false, но gettype может вернуть 'resource (closed)'
if (is_resource($handle)) {
    echo 'Ресурс активен';
} else {
    echo 'Ресурс закрыт';
}
echo '\nТип по gettype: ' . gettype($handle);
  
Ресурс закрыт
Тип по gettype: resource (closed)
  

Определение типа переменной в PHP (gettype, is_*) - comments

En
определить тип php (php)