Проверка типов значений в языке 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)