Работа с переменными в PHP: практическое руководство для веб-разработчика
Основы работы с переменными PHP
Переменные в PHP представляют собой именованные контейнеры для хранения данных. Они начинаются со знака доллара $, за которым следует имя переменной. Имя должно начинаться с буквы или символа подчеркивания, может содержать буквы, цифры и подчеркивания. В отличие от некоторых языков, PHP не требует явного объявления типа; тип определяется автоматически на основе присвоенного значения.
Базовое объявление и использование переменных
Простейший способ создать переменную - присвоить ей значение с помощью оператора =.
<?php
$greeting = 'Здравствуйте';
$year = 2025;
$price = 99.99;
$isActive = true;
echo $greeting . ', текущий год: ' . $year;
?>
Page php var (переменные php на странице)
Здравствуйте, текущий год: 2025
Переменные могут использоваться в выражениях, внутри строк в двойных кавычках происходит подстановка значения (интерполяция). Например:
<?php
$name = 'Анна';
echo 'Привет, ' . $name . '!';
?>
Привет, Анна!
Проблемы и типичные ошибки:
- Ошибка синтаксиса при пропуске точки с запятой или знака доллара.
- Использование несуществующей переменной приводит к предупреждению (Warning) и интерпретации как null.
- При использовании одинарных кавычек интерполяция не происходит; вместо $name будет выведен литерал $name.
- Путаница между оператором присваивания = и сравнения ==.
Варианты использования переменных на веб-странице
Вопрос: Как получить данные, переданные через URL (GET-запрос)?
PHP предоставляет суперглобальный массив $_GET, который содержит параметры из строки запроса. Например, для URL page.php?user=Иван&age=30 можно получить:
<?php
$user = $_GET['user'];
$age = $_GET['age'];
echo 'Пользователь: ' . $user . ', возраст: ' . $age;
?>
Пользователь: Иван, возраст: 30
Пояснение: Ключи массива соответствуют именам параметров. Все значения изначально являются строками. Рекомендуется проверять существование ключа с помощью isset() или фильтровать данные.
Типичные ошибки:
- Попытка обратиться к несуществующему параметру без проверки - вызывает Warning и может нарушить логику.
- Чтобы избежать XSS, вывод данных следует экранировать с помощью htmlspecialchars().
Вопрос: Как обработать данные, отправленные через форму методом POST?
Аналогично GET, используется массив $_POST. Пример формы:
<form method='post' action='handler.php'>
<input type='text' name='login'>
<input type='password' name='pass'>
<input type='submit'>
</form>
В обработчике handler.php:
<?php
$login = $_POST['login'];
$password = $_POST['pass'];
// Проверка и обработка
echo 'Введен логин: ' . htmlspecialchars($login);
?>
Введен логин: example_user
Пояснение: Данные POST не видны в URL, что удобно для передачи конфиденциальной информации. Рекомендуется применять фильтрацию и валидацию.
Ошибки:
- Использование $_REQUEST вместо $_POST или $_GET - снижает безопасность.
- Неэкранированный вывод пароля или других данных.
- Следует проверять метод запроса через $_SERVER['REQUEST_METHOD'].
Вопрос: Как сохранить данные пользователя между разными страницами сайта?
Для этого применяются сессии. Сессия - это временное хранилище на сервере, идентифицируемое уникальным ID, который передается через cookie или URL. Пример:
<?php
session_start(); // Начинаем сессию
$_SESSION['user_id'] = 42;
$_SESSION['role'] = 'admin';
echo 'Сессия создана, id пользователя: ' . $_SESSION['user_id'];
?>
Сессия создана, id пользователя: 42
На другой странице сессия восстанавливается вызовом session_start(), после чего доступны сохраненные значения.
Проблемы:
- Вызов session_start() должен быть до любого вывода в браузер, иначе будет ошибка headers already sent.
- Неочищенные сессии после выхода пользователя - следует вызывать session_destroy().
- Конфликты при одновременном использовании с другими cookie.
Вопрос: Как запомнить предпочтения пользователя на длительный срок с помощью cookie?
Cookie - это небольшие данные, хранящиеся на стороне клиента. Устанавливаются функцией setcookie():
<?php
setcookie('theme', 'dark', time() + 3600 * 24 * 30); // на 30 дней
setcookie('lang', 'ru', time() + 3600 * 24 * 30);
?>
Чтение cookie происходит через массив $_COOKIE:
<?php
if (isset($_COOKIE['theme'])) {
$theme = $_COOKIE['theme'];
echo 'Тема оформления: ' . $theme;
}
?>
Тема оформления: dark
Пояснение: Cookie автоматически отправляются с каждым запросом. Время жизни задается в секундах от текущего момента. Не рекомендуется хранить конфиденциальные данные в cookie.
Ошибки:
- Попытка установить cookie после вывода контента - приводит к ошибке.
- Неэкранирование значений при выводе, так как они могут содержать HTML.
- Игнорирование проверки на существование ключа в $_COOKIE.
Расширенные примеры использования переменных PHP
В данном разделе представлены более сложные и редко используемые сценарии работы с переменными, которые могут пригодиться в реальных проектах.
Пример 1: Фильтрация и валидация GET-параметров
<?php
// URL: page.php?age=25&email=test@example.com
$age = filter_input(INPUT_GET, 'age', FILTER_VALIDATE_INT);
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);
if ($age === false || $age === null) {
$age = 0; // значение по умолчанию
}
if ($email === false || $email === null) {
$email = 'не указан';
}
echo 'Возраст: ' . $age . ', Email: ' . $email;
?>
Возраст: 25, Email: test@example.com
Использование filter_input позволяет избежать ручных проверок и повышает безопасность.
Пример 2: Динамические переменные (variable variables)
<?php
$varName = 'color';
$$varName = 'red'; // эквивалентно $color = 'red';
echo $color; // выведет 'red'
// Пример с массивом
$attributes = ['width', 'height'];
foreach ($attributes as $attr) {
$$attr = 100;
}
echo 'Ширина: ' . $width . ', высота: ' . $height;
?>
red Ширина: 100, высота: 100
Пояснение: Динамические переменные могут быть полезны при работе с неизвестными заранее именами, однако их использование часто делает код менее читаемым и потенциально опасным.
Пример 3: Работа с сессией для корзины покупок
<?php
session_start();
// Добавление товара в корзину
$productId = 123;
$quantity = 2;
if (!isset($_SESSION['cart'])) {
$_SESSION['cart'] = [];
}
if (isset($_SESSION['cart'][$productId])) {
$_SESSION['cart'][$productId] += $quantity;
} else {
$_SESSION['cart'][$productId] = $quantity;
}
// Вывод содержимого корзины
print_r($_SESSION['cart']);
?>
Array
(
[123] => 2
)
Пояснение: В сессии можно хранить сложные структуры, такие как массивы. Важно инициализировать структуру перед использованием.
Пример 4: Загрузка файлов и работа с $_FILES
<?php
// В форме: <input type='file' name='photo'>
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['photo'])) {
$file = $_FILES['photo'];
$fileName = $file['name'];
$tmpPath = $file['tmp_name'];
$error = $file['error'];
if ($error === UPLOAD_ERR_OK) {
move_uploaded_file($tmpPath, 'uploads/' . $fileName);
echo 'Файл ' . $fileName . ' загружен успешно.';
} else {
echo 'Ошибка загрузки: код ' . $error . '.';
}
}
?>
Файл image.jpg загружен успешно.
Пояснение: Массив $_FILES содержит информацию о загруженных файлах. Необходимо проверять код ошибки и перемещать файл из временной директории.
Пример 5: Использование extract() с осторожностью
<?php
$data = ['name' => 'Петр', 'age' => 28];
extract($data);
echo 'Имя: ' . $name . ', возраст: ' . $age;
?>
Имя: Петр, возраст: 28
Пояснение: extract() импортирует переменные из массива в текущую область видимости. Это может быть удобно, но перезаписывает существующие переменные и создает риск конфликтов, поэтому рекомендуется использовать редко и с флагом EXTR_SKIP или EXTR_PREFIX_SAME.