Определение типа данных в PHP: полный набор средств
Получение типа переменной в PHP
В PHP существует несколько способов узнать тип данных, хранящихся в переменной. Каждый метод имеет свои особенности и область применения. Ниже рассмотрены основные варианты.
Как получить название типа переменной в виде строки?
Основным и наиболее прямым способом является использование функции gettype(). Она принимает любое значение и возвращает строку, описывающую его тип: "integer", "double" (для float), "string", "array", "object", "resource", "NULL", "boolean", "unknown type".
$val = 42;
echo gettype($val); // integer
Php получить тип (получение типа переменной в php)
integer
Php получить значение (получение значения в php)
Цель: быстрое определение типа для отладки или условной логики. Случаи использования: логирование, адаптация поведения скрипта в зависимости от типа переданных данных.
Проблема: gettype() возвращает "double" для float, а не "float". В PHP 8.0 появилась функция get_debug_type(), которая выдаёт более читаемое имя, включая название класса для объектов. Ошибка: путаница между "NULL" и "null" на разных языках - gettype всегда возвращает английские строки.
Как проверить, является ли переменная целым числом?
Для булевых проверок на конкретный тип предназначены функции семейства is_*: is_int(), is_string(), is_array(), is_object(), is_bool(), is_float(), is_null(), is_resource(), is_scalar(), is_callable() и другие.
$val = 3.14;
if (is_float($val)) {
echo "Это дробное число";
}
получить строку php (получение строки в php)
Цель: условное выполнение кода только при определённом типе. Случаи: валидация входных данных, защита от ошибок типов.
Ошибка: is_int() возвращает false для строки, содержащей число. Необходимо различать тип и содержимое. is_numeric() проверяет на числовое содержимое, но это не проверка типа.
Как увидеть полную информацию о переменной, включая значение и тип?
Функция var_dump() выводит структурированную информацию о переменной: тип, длину (для строк и массивов), значение. Это инструмент отладки.
$data = ['name' => 'PHP', 'version' => 8.2];
var_dump($data);
array(2) {
["name"]=>
string(3) "PHP"
["version"]=>
float(8.2)
}
Цель: детальная диагностика содержимого переменной. Случаи: разработка, поиск ошибок, анализ ответов API.
Проблема: var_dump() выводит данные напрямую, а не возвращает строку. Для получения строки используется var_export() или print_r(). В production вызов var_dump() может быть опасен, если не контролировать вывод.
Как определить тип переменной в PHP 8 с учётом union типов?
В PHP 8 появилась функция get_debug_type(), которая возвращает более информативное имя типа. Для объектов выводится полное имя класса, для ресурсов - тип ресурса. Для union-типов возвращается объединение.
$val = null;
echo get_debug_type($val); // null
class MyClass {}
$obj = new MyClass();
echo get_debug_type($obj); // MyClass
Цель: получение точного типа для современных проектов. Случаи: работа с объектами, отладка в условиях сложных типов.
Проблема: get_debug_type() доступна только с PHP 8.0. В старых версиях нужно использовать gettype() или рефлексию.
Как узнать тип объекта с помощью оператора instanceof?
Оператор instanceof проверяет, принадлежит ли объект к определённому классу или реализует ли интерфейс. Он не возвращает строку, но отвечает на вопрос о типе.
class Car {}
$myCar = new Car();
if ($myCar instanceof Car) {
echo "Это автомобиль";
}
Цель: проверка соответствия объекта ожидаемому классу. Случаи: полиморфизм, обработка коллекций объектов.
Ошибка: instanceof не работает с примитивными типами. Для скалярных значений используйте is_* функции.
Как получить тип ресурса в PHP?
Для ресурсов (например, соединение с базой данных, файловый дескриптор) gettype() возвращает "resource". Чтобы узнать конкретный тип ресурса, используется get_resource_type().
$fp = fopen('file.txt', 'r');
echo get_resource_type($fp); // stream
Цель: идентификация вида ресурса. Случаи: отладка работы с ресурсами, освобождение ресурсов.
Проблема: начиная с PHP 8.0 ресурсы могут быть заменены объектами (например, PDOStatement). get_resource_type() выдаёт предупреждение для не-ресурсов.
Как получить имя класса объекта с помощью рефлексии?
Используя класс ReflectionClass, можно получить полное имя класса объекта, включая пространство имён.
namespace App\Models;
class User {}
$user = new User();
$ref = new ReflectionClass($user);
echo $ref->getName(); // App\Models\User
Цель: динамическое определение класса для фреймворков или ORM. Случаи: автоматическая загрузка, сериализация.
Проблема: рефлексия медленнее прямых вызовов. Не рекомендуется для часто используемых проверок.
Расширенные примеры определения типа переменной
// Сравнение gettype и is_* для различных значений
$values = [42, 3.14, 'hello', [1,2], null, true, fopen(__FILE__, 'r'), new stdClass(), function(){}];
foreach ($values as $val) {
echo gettype($val) . ' | ' . (is_string($val) ? 'string' : 'not string') . "\n";
}
integer | not string double | not string string | string array | not string NULL | not string boolean | not string resource | not string object | not string object | not string
Пример показывает, что gettype даёт общее название, а is_* позволяет проверить конкретный тип. Для callable функция is_callable() возвращает true.
// Работа с union типами и get_debug_type (PHP 8+)
$mixed = rand(0,1) ? 'text' : 123;
echo get_debug_type($mixed); // string или int
// Получение типа вложенного элемента массива
$matrix = [[1,2], ['a','b']];
$types = array_map(function($row) {
return array_map('gettype', $row);
}, $matrix);
print_r($types);
Array
(
[0] => Array
(
[0] => integer
[1] => integer
)
[1] => Array
(
[0] => string
[1] => string
)
)
// Использование instanceof для интерфейсов
interface Drawable {}
class Circle implements Drawable {}
$shape = new Circle();
echo ($shape instanceof Drawable) ? 'Да' : 'Нет'; // Да
// Получение типа через ReflectionParameter (на примере функции)
function process(int $id, string $name) {}
$refFunc = new ReflectionFunction('process');
foreach ($refFunc->getParameters() as $param) {
$type = $param->getType();
echo $param->getName() . ': ' . $type . "\n";
}
id: int name: string
// Определение типа ресурса и его закрытие
$fh = fopen('/dev/null', 'r');
echo get_resource_type($fh) . "\n"; // stream
fclose($fh);
// После закрытия gettype вернёт boolean (false)
echo gettype($fh); // boolean
// gettype для false и null (различия)
$false = false;
$null = null;
echo gettype($false) . ' vs ' . gettype($null); // boolean vs NULL
// В PHP 8.0 get_debug_type для false возвращает 'false'
echo ' | ' . get_debug_type($false); // false
// Получение типа callable: строка, массив, Closure
$callable1 = 'strlen';
$callable2 = [new stdClass(), 'method'];
$callable3 = function() {};
foreach ([$callable1, $callable2, $callable3] as $c) {
echo gettype($c) . ' - is_callable: ' . (is_callable($c) ? 'true' : 'false') . "\n";
}
string - is_callable: true array - is_callable: false object - is_callable: true
Второй элемент не является callable, так как метод 'method' не существует. is_callable проверяет возможность вызова.
// Обработка unknown type (например, из внешнего источника)
$unknown = unserialize('N;'); // null
$type = gettype($unknown);
if ($type === 'NULL') {
echo 'Это null';
}