Работа с переменными в PHP: практическое руководство для веб-разработчика

Раздел: Основы программирования на PHP -> Переменные 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.

Переменные PHP на странице - comments

En
Page php var (php)