Данные PHP: от простых значений до сложных структур

Раздел: 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)
}

данные PHP - comments

En
Data php (php)