Проверка типа переменной в 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']);
Результат: 'Все типы верны'.