Типы данных PHP: от простого к сложному
Основные типы данных и их применение
PHP поддерживает несколько базовых типов данных: int (целые числа), float (числа с плавающей точкой), string (строки), bool (логический тип), array (массивы), object (объекты), null (отсутствие значения), resource (внешние ресурсы) и callable (вызываемые сущности). Каждый тип имеет свои особенности и методы работы.
Пример создания переменных разных типов:
$intVar = 42; // int
$floatVar = 3.14; // float
$stringVar = "Привет"; // string
$boolVar = true; // bool
$arrayVar = [1, 2, 3]; // array
$nullVar = null; // nullПроверить тип переменной можно с помощью функций gettype() или is_тип() (например, is_int, is_string).
$value = 123;
echo gettype($value); // integer
var_dump(is_int($value)); // bool(true)Типичная ошибка: при сравнении переменных разных типов PHP выполняет неявное приведение, что может привести к неожиданным результатам. Например:
var_dump(0 == '0'); // true
var_dump(0 == 'abc'); // true (так как 'abc' приводится к 0)
var_dump('123' == 123); // trueДля строгого сравнения используйте оператор === (тройное равно), который сравнивает и значение, и тип.
Как явно преобразовать один тип в другой?
Приведение типов выполняется с помощью конструкций (int), (string), (bool) и других, а также функций intval(), strval() и т.д.
$number = "42.7";
$intNumber = (int)$number; // 42 (дробная часть отбрасывается)
$floatNumber = (float)$number; // 42.7
$boolValue = (bool)$number; // true (непустая строка)
echo "$intNumber, $floatNumber, ".($boolValue?'true':'false');Проблема: при приведении строки к целому числу PHP берёт начальную цифровую часть и игнорирует остальное. Если строка не начинается с числа, результат будет 0.
echo (int)"abc123"; // 0Какие типы данных появились в PHP 8?
Начиная с PHP 8 были введены union types (объединение типов), mixed, never, false и null как самостоятельные типы для объявлений.
function process(int|string $value): int|string {
return $value;
}
function neverReturns(): never {
exit();
}Ошибка: при использовании union types нужно учитывать порядок приоритетов при приведении. Например, если передать null в функцию с типом int|string, это вызовет ошибку, если не добавить null в объединение.
Расширенные примеры работы с типами
1. Использование resource и его освобождение
$file = fopen('test.txt', 'r');
if (is_resource($file)) {
echo "Ресурс открыт";
fclose($file);
}Ресурс открыт
2. Callable тип: вызов функции через переменную
function square($x) { return $x * $x; }
$func = 'square';
echo $func(5); // 25
// Анонимная функция как callable
$double = function($x) { return $x * 2; };
echo $double(3); // 63. Nullable типы (PHP 7.1+)
function findUser(int $id): ?User {
// возвращает User или null
return $id > 0 ? new User() : null;
}
$user = findUser(0);
var_dump($user); // NULL4. Массивы: ключи и значения разных типов
$mixed = [
0 => 'zero',
'key' => 123,
3.14 => 'pi', // ключ float приводится к int (3)
true => 'bool' // true приводится к 1
];
print_r($mixed);Array
(
[0] => zero
[key] => 123
[1] => bool
[3] => pi
)5. Объект stdClass из массива
$array = ['name' => 'Анна', 'age' => 25];
$object = (object)$array;
echo $object->name; // Анна6. Использование var_dump для отладки типов
$data = [1, 'two', null, [3]];
var_dump($data);array(4) {
[0]=> int(1)
[1]=> string(3) "two"
[2]=> NULL
[3]=> array(1) {
[0]=> int(3)
}
}7. Тип mixed в PHP 8
function debug(mixed $value): void {
var_dump($value);
}
debug(42);
debug('строка');8. Автоматическое приведение в математических операциях
$a = '10';
$b = 5;
echo $a + $b; // 15 (строка преобразована в int)
echo $a . $b; // '105' (конкатенация, int преобразован в строку)