Проверка типа переменной в PHP: основные приёмы и скрипты

Раздел: Основы программирования на PHP -> Типы данных в PHP

Проверка типа переменной в PHP

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

Основное решение включает использование встроенных функций gettype() и набора is_* функций. Функция gettype() возвращает строку с названием типа (например, 'integer', 'string', 'array'). Для условных проверок лучше применять is_int(), is_string(), is_array() и т.д., так как они возвращают true или false и учитывают строгую типизацию.


$value = 42;
echo gettype($value); // integer
var_dump(is_int($value)); // bool(true)
  

Php check type (проверка типа переменной в php)

Для отладки удобно использовать var_dump(), который выводит тип и значение. В PHP 8 появилась функция get_debug_type(), которая даёт более полную информацию об объектах (включая имя класса).

Проблема: gettype() для объекта возвращает 'object' без указания класса. Решение: в PHP 8 используйте get_debug_type(). В более старых версиях комбинируйте is_object() и get_class().

Типичная ошибка: попытка сравнить результат gettype() с типом в условии без учёта регистра. Названия типов всегда в нижнем регистре.

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

Используйте is_float() или is_double() (синоним). Обратите внимание: целое число, записанное через десятичную точку (например, 3.0), считается float.


$num = 3.14;
var_dump(is_float($num)); // true
  

Of type string is deprecated php (предупреждение об устаревании типа string в php)

Проблема: значения из внешних источников (например, форм) приходят как строки. Даже "3.14" является строкой. Решение: сначала преобразуйте тип с помощью floatval() или is_numeric().

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

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


$arr = [];
var_dump(is_array($arr)); // true
  

Php mime type (mime-типы в php)

Проблема: объекты, реализующие ArrayAccess, не считаются массивами. Для проверки возможности использования как массива применяйте is_array() или $var instanceof ArrayAccess.

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

Используйте is_string(). Она возвращает true только для строкового типа.


$str = "Hello";
var_dump(is_string($str)); // true
  

Php set type (функция settype() в php)

Проблема: числа, преобразованные в строку неявно, остаются числами. Например, (string)10 даёт строку "10", но исходная переменная была integer. Для проверки содержимого используйте ctype_digit() или preg_match().

Как узнать класс объекта (в том числе унаследованный)?

Применяйте get_class($object) для получения имени класса. Для проверки принадлежности к иерархии используйте instanceof.


class A {}
class B extends A {}
$obj = new B();
echo get_class($obj); // B
var_dump($obj instanceof A); // true
  

Php number type (числовые типы в php)

Проблема: get_class() без аргумента возвращает имя класса, в котором вызвана. Для ленивой проверки типа используйте $obj::class (PHP 8).

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

Воспользуйтесь is_scalar(). Она возвращает true для всех скалярных значений, включая null? Нет, null не скаляр.


$vals = [1, 1.5, "text", true, null];
foreach ($vals as $v) {
    echo is_scalar($v) ? "скаляр" : "не скаляр";
}
// скаляр, скаляр, скаляр, скаляр, не скаляр
  

Strict type php (строгая типизация в php)

Проблема: is_scalar() считает ресурсы не скалярами. Для проверки на ресурс используйте is_resource().

Как определить, является ли переменная нулевой (null)?

Используйте is_null() или оператор сравнения === null.


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

Php type int (тип int в php)

Проблема: необъявленные переменные вызывают предупреждение. Перед проверкой используйте isset() или @ (не рекомендуется).

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

Применяйте is_resource(). Ресурс - это специальный тип для внешних ресурсов (файлы, соединения БД).


$handle = fopen('/tmp/file.txt', 'r');
var_dump(is_resource($handle)); // true
fclose($handle);
  

Php 7 types (типы данных в php 7)

Проблема: после закрытия ресурса он перестаёт быть ресурсом, is_resource() вернёт false. Проверяйте состояние до освобождения.

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

В PHP 8.0 появилась функция get_debug_type(), которая возвращает строку с точным типом: для объектов – имя класса, для ресурсов – тип ресурса, для скаляров – традиционные названия.


$obj = new stdClass();
echo get_debug_type($obj); // stdClass
$fp = fopen(__FILE__, 'r');
echo get_debug_type($fp); // resource (stream)
  

Проблема: функция доступна только в PHP 8+; в старых версиях используйте комбинацию is_object() + get_class() или is_resource() + get_resource_type().

Расширенные примеры проверки типа переменной

Пример 1: Проверка типа с преобразованием и обработкой ошибок

Допустим, нужно проверить, что значение из GET-параметра является целым числом. Сначала следует убедиться, что переменная существует, затем проверить её тип и, при необходимости, преобразовать.

Пример

$raw = $_GET['id'] ?? null;
if (is_null($raw)) {
    $error = 'Параметр id отсутствует';
} elseif (!is_numeric($raw)) {  // is_numeric допускает строки с числами
    $error = 'Параметр id не является числом';
} else {
    $id = (int) $raw;  // явное преобразование
    $error = null;
}

Результат: в $id будет целое число, если проверка пройдена.

Пример 2: Проверка типа в callback-функции

При написании обобщённых функций-обработчиков полезно проверять типы аргументов.

Пример

function process($data) {
    if (!is_array($data) && !is_object($data)) {
        throw new InvalidArgumentException('Ожидается массив или объект');
    }
    foreach ($data as $key => $value) {
        echo get_debug_type($value) . ": $value\n";
    }
}

Результат: функция выводит тип каждого элемента.

Пример 3: Использование match (PHP 8) для обработки разных типов

Конструкция match позволяет компактно реагировать на тип.

Пример

$result = match (true) {
    is_int($var) => 'Целое число',
    is_float($var) => 'Дробь',
    is_string($var) => 'Строка',
    is_bool($var) => 'Булево',
    is_array($var) => 'Массив',
    is_null($var) => 'Null',
    default => 'Другой тип'
};
echo $result;

Результат: строка с названием типа.

Пример 4: Комбинированная проверка с оператором instanceof для интерфейсов

Если объект реализует интерфейс, instanceof может проверить это.

Пример

interface Cacheable {}
class Data implements Cacheable {}
$instance = new Data();
var_dump($instance instanceof Cacheable); // true

Результат: bool(true).

Пример 5: Проверка типа с использованием фильтров (filter_var)

Для проверки ввода из форм часто используют filter_var с флагами.

Пример

$email = 'user@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'Email корректен';
} else {
    echo 'Некорректный Email';
}

Результат: 'Email корректен'.

Пример 6: Рекурсивная проверка типов в многомерном массиве

Полезно для валидации сложных структур данных.

Пример

function checkTypes(array $data, array $expected) {
    foreach ($expected as $key => $type) {
        if (!array_key_exists($key, $data)) {
            return "Отсутствует ключ $key";
        }
        if (!call_user_func("is_$type", $data[$key])) {
            return "Ключ $key должен быть $type";
        }
    }
    return 'Все типы верны';
}
$data = ['name' => 'Иван', 'age' => 30];
echo checkTypes($data, ['name' => 'string', 'age' => 'int']);

Результат: 'Все типы верны'.

Проверка типа переменной в PHP - comments

En
Php check type (php)