Данные PHP: от простых значений до сложных структур
Основные типы данных PHP и работа с ними
PHP поддерживает несколько основных типов данных: скалярные (int, float, string, bool), составные (array, object) и специальные (null, resource). Выбор типа влияет на операции, память и поведение переменных. Ниже рассматриваются варианты работы с каждым типом, их особенности и типичные ошибки.
Как работать с целыми числами и избежать переполнения?
Целые числа (int) хранятся в диапазоне, зависящем от архитектуры (обычно 64-бит). Для безопасного преобразования из строки используется приведение (int) или функция intval().
$a = 42;
$b = (int) '123';
$c = intval('456abc'); // вернет 456
Максимальное значение доступно через константу PHP_INT_MAX. При выходе за пределы число автоматически преобразуется в float.
Типичная ошибка: деление на ноль вызывает предупреждение, результат - false или float(NAN). Для проверки используйте is_numeric() перед операциями.
Как правильно создавать строки разных видов?
Строки задаются одинарными или двойными кавычками, а также heredoc и nowdoc. Двойные кавычки интерполируют переменные, требуют экранирования спецсимволов.
$name = 'Мир';
echo "Привет, $name!"; // Привет, Мир!
echo 'Привет, $name!'; // Привет, $name!
Heredoc удобен для многострочных строк:
$text = <<<EOT
Строка с $name
EOT;
Частая ошибка: забыть экранировать кавычки внутри или использовать not-a-number как часть строки. Для проверки длины применяйте mb_strlen() при мультибайтовых кодировках.
Как булевы значения влияют на условия?
Логический тип (bool) принимает true или false. Неявное приведение происходит в условиях: 0, пустая строка, null, пустой массив считаются false.
$flag = true;
if ($flag) echo 'истина';
if (1) echo 'тоже истина';
Ошибка: сравнение с == может дать неожиданный результат из-за приведения типов (например, '0' == false - true). Используйте строгое равенство ===.
Как хранить данные в массивах с различными ключами?
Массивы могут быть индексированными (числовые ключи) или ассоциативными (строковые). Добавление элемента без ключа присваивает следующий числовой индекс.
$arr = ['a', 'b'];
$arr[] = 'c'; // [0=>'a',1=>'b',2=>'c']
$user = ['name' => 'Иван', 'age' => 30];
Проблема: проверка существования ключа через isset() не отличает null от отсутствия. Используйте array_key_exists().
Когда переменная может быть NULL и что такое ресурс?
NULL - отсутствие значения. Возвращается функцией, если результат не определён. Ресурс (resource) - ссылка на внешний ресурс (файл, соединение БД). После закрытия ресурс не освобождается автоматически, но сборщик мусора уничтожит его.
$var = null;
$file = fopen('file.txt', 'r'); // resource
Ошибка: повторное использование ресурса после закрытия выдаст предупреждение. Проверяйте через is_resource().
Как преобразовать один тип данных в другой?
Явное приведение выполняется указанием типа в скобках: (int), (string), (array). Неявное - происходит при операциях (например, сложение строки и числа).
$a = '123';
$b = $a + 5; // 128 (неявное приведение)
$c = (float) $a; // 123.0
Потеря точности: приведение float к int отбрасывает дробную часть. Используйте round() или floor() при необходимости.
Расширенные примеры работы с типами данных
Битовые маски на целых числах
Можно хранить несколько флагов в одном int, используя побитовые операции.
define('READ', 1); // 2^0
define('WRITE', 2); // 2^1
define('EXEC', 4); // 2^2
$perms = READ | EXEC; // 5
if ($perms & READ) echo 'чтение разрешено';
чтение разрешено
Плавающая точка и ошибки округления
Из-за двоичного представления некоторые числа не точны.
$a = 0.1 + 0.2;
var_dump($a === 0.3); // false
var_dump(round($a, 1) === 0.3); // true
bool(false) bool(true)
Интерполяция с heredoc и сложными выражениями
В heredoc можно использовать фигурные скобки для доступа к элементам массива или методам объектов.
$user = ['name' => 'Мария'];
echo <<<TEXT
Пользователь: {$user['name']}
TEXT;
Пользователь: Мария
Сериализация массива для хранения
Функции serialize() и unserialize() преобразуют сложные данные в строку.
$data = ['apple', 'banana', ['key' => 'value']];
$serialized = serialize($data);
echo $serialized;
a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:1;a:1:{s:3:"key";s:5:"value";}}
Валидация чисел с плавающей точкой
Используйте filter_var с фильтром FILTER_VALIDATE_FLOAT.
$test = '3.14';
if (filter_var($test, FILTER_VALIDATE_FLOAT) !== false) {
echo 'корректное число';
}
корректное число
Работа с типом resource: чтение файла
Ресурс, полученный от fopen(), передаётся в функции для чтения.
$handle = fopen('/tmp/test.txt', 'w+');
fwrite($handle, 'строка');
rewind($handle);
echo fread($handle, 1024);
fclose($handle);
строка
Функция gettype и var_dump для отладки
Удобно узнавать тип переменной.
$var = [1,2,3];
echo gettype($var) . '\n';
var_dump($var);
array
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}