Определение типа данных в PHP: полный набор средств

Раздел: Основы 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';
}

Получение типа переменной в PHP - comments

En
Php получить тип (php)