Переменные в PHP: основные конструкции и нюансы использования

Раздел: Разработка на PHP -> Основы PHP

Что такое переменные в PHP

Как сохранить и использовать данные в PHP?

Переменная - это именованный контейнер для хранения значения. В PHP переменная всегда начинается с символа доллара $, после которого следует имя. Имя может содержать буквы, цифры и символ подчеркивания, но не может начинаться с цифры. Регистр символов учитывается ($myVar и $myvar - разные переменные).

<?php
$name = 'Иван';           // строка
$age = 25;                // целое число
$price = 49.99;           // число с плавающей точкой
$isActive = true;         // булево значение

// Вывод значений
echo $name;              // Иван
?>

Присваивание значения происходит с помощью оператора =. Справа может стоять выражение, результат которого будет записан в переменную.

<?php
$sum = 10 + 5;            // $sum = 15
$greeting = 'Привет, ' . $name;  // конкатенация
?>

Типичная ошибка: использование переменной без инициализации

Если обратиться к необъявленной переменной, PHP выдаёт предупреждение (notice) уровня E_WARNING. Например:

<?php
echo $undefinedVar;  // Notice: Undefined variable: undefinedVar
?>

Решение:

Перед использованием переменной присвоить ей значение или проверить существование с помощью isset():

<?php
if (isset($undefinedVar)) {
    echo $undefinedVar;
} else {
    echo 'Переменная не определена';
}
?>

Цель использования:

Хранение промежуточных результатов, передача данных между частями скрипта, построение динамического контента.

Как задать имя переменной из другой переменной (переменные переменные)?

PHP позволяет использовать значение одной переменной как имя другой. Такая конструкция называется переменной переменной.

<?php
$varName = 'color';
$$varName = 'red';         // эквивалентно $color = 'red';
echo $color;              // red
?>

Когда применяется:

При динамическом создании множества однотипных переменных, например, при обработке данных из внешнего источника.

Проблема: путаница с синтаксисом

Если нужно использовать вложенные переменные переменные, требуется следить за порядком выполнения.

<?php
$a = 'hello';
$hello = 'world';
echo $$$a;  // ошибка, так как PHP пытается найти $($$a), но синтаксис сбивчивый
?>

Рекомендация:

Избегать глубокой вложенности, использовать массивы для динамических ключей.

Как передать переменную по ссылке, а не по значению?

По умолчанию переменные передаются по значению (копия). Чтобы функция могла изменять оригинальную переменную, используют ссылки &.

<?php
function addExclamation(&$text) {
    $text .= '!';
}

$str = 'Привет';
addExclamation($str);
echo $str;  // Привет!
?>

Цель:

Изменение массивов или больших объектов без копирования, что экономит память. Ссылки также применяются в итераторах (например, foreach (&$array)).

Ошибка: случайное изменение переменной

Если передать по ссылке в функцию, которая не ожидает этого, может возникнуть неожиданное поведение. Всегда документировать использование ссылок.

Как сделать переменную доступной в любой части скрипта (глобальная область видимости)?

По умолчанию переменные, объявленные вне функций, видны только в глобальной области. Внутри функции к ним можно обратиться через ключевое слово global или массив $GLOBALS.

<?php
$siteName = 'Мой сайт';

function showSite() {
    global $siteName;
    echo $siteName;
}

showSite();  // Мой сайт
?>

Альтернативный способ:

<?php
function showSite2() {
    echo $GLOBALS['siteName'];
}
?>

Когда использовать:

Для конфигурационных данных или ресурсов (например, соединение с БД). Однако злоупотребление глобальными переменными усложняет отладку, лучше передавать параметры в функцию явно.

Проблема: конфликт имён

Если в функции объявить переменную с тем же именем, она перекроет глобальную. Всегда явно указывать global.

Как сохранить значение переменной между вызовами функции (статические переменные)?

Статическая переменная не теряет своё значение после завершения функции. Объявляется с ключевым словом static.

<?php
function counter() {
    static $count = 0;
    $count++;
    echo $count;
}

counter(); // 1
counter(); // 2
counter(); // 3
?>

Применение:

Счётчики вызовов, кеширование внутри цикла, рекурсивные функции.

Ошибка: присвоение статической переменной нестатического значения

Статическая переменная может быть инициализирована только литералом или константой, но не выражением (до PHP 8.1).

<?php
function badStatic() {
    static $val = time(); // Parse error: syntax error
}
?>

Начиная с PHP 8.1 допускается инициализация выражением.

Как объявить константу, которая не может быть изменена?

Константы в PHP не используют символ доллара. Определяются с помощью define() или ключевым словом const внутри класса.

<?php
define('SITE_NAME', 'Example');
const VERSION = '1.0.0';

echo SITE_NAME;  // Example
echo VERSION;    // 1.0.0
?>

Различия:

  • define() можно вызывать в любом месте, в том числе внутри блока условий.
  • const работает на этапе компиляции, быстрее, но может быть использована только на верхнем уровне.

Цель:

Фиксированные настройки, которые не должны меняться во время выполнения.

Ошибка: попытка изменить константу

<?php
define('PI', 3.14);
define('PI', 3.14159); // Notice: Constant PI already defined
?>

После определения константу нельзя переопределить или удалить.

Как определить тип переменной и при необходимости преобразовать его?

PHP - язык с динамической типизацией. Тип переменной определяется значением. Для проверки типа используются функции is_int(), is_string(), is_array() и т.д. Для явного приведения типов применяются операторы (int), (string), (array) и другие.

<?php
$value = '42';
var_dump(is_int($value));  // bool(false)

$intValue = (int)$value;
var_dump(is_int($intValue)); // bool(true)
echo $intValue;  // 42 (число)
?>

Цель:

Гарантировать определённый тип данных перед выполнением операций (например, арифметических).

Проблема: неожиданное приведение типов (type juggling)

PHP автоматически приводит типы в выражениях, что может вызвать путаницу.

<?php
$result = '3' + 5;        // 8 (строка преобразуется в число)
echo $result;
?>

Для строгого сравнения значений и типов используйте оператор ===.

Как удалить переменную и освободить память?

Для удаления переменной служит функция unset(). После этого переменная перестаёт существовать.

<?php
$temp = 'временные данные';
unset($temp);
if (isset($temp)) {
    echo 'Переменная существует';
} else {
    echo 'Переменная удалена';  // этот вывод
}
?>

Когда использовать:

Для освобождения памяти перед долгими операциями, удаления элементов массива (через индекс).

Ошибка: удаление элемента массива не переиндексирует числовые ключи

<?php
$arr = [0 => 'a', 1 => 'b', 2 => 'c'];
unset($arr[1]);
print_r($arr);
// Array ( [0] => a [2] => c )  // индекс 1 пропущен
?>

Если нужна сплошная нумерация, используйте array_values().

Расширенные и неочевидные примеры работы с переменными в PHP

Пример 1: Использование переменных переменных с циклами

Динамическое создание набора переменных на основе массива.

Пример
<?php
$colors = ['red', 'green', 'blue'];
foreach ($colors as $color) {
    ${$color . '_code'} = '#'. bin2hex(random_bytes(3));
}
echo $red_code;   // например #a3c0f1
?>
#a3c0f1 (случайное значение)

Этот приём иногда применяется в шаблонизаторах, но лучше заменить его ассоциативным массивом.

Пример 2: Передача по ссылке в анонимных функциях (замыкания)

Пример
<?php
$counter = 0;
$increment = function() use (&$counter) {
    $counter++;
};
$increment();
$increment();
echo $counter;  // 2
?>
2

Без амперсанда &$counter замыкание получило бы копию, и $counter не изменилась бы.

Пример 3: Статические переменные в рекурсивных функциях (аккумулятор)

Пример
<?php
function factorial($n) {
    static $cache = [];
    if ($n <= 1) return 1;
    if (isset($cache[$n])) {
        return $cache[$n];
    }
    $result = $n * factorial($n - 1);
    $cache[$n] = $result;
    return $result;
}
echo factorial(5);  // 120
echo factorial(5);  // 120 (берётся из кеша)
?>
120120

Кеширование с помощью static-массива ускоряет повторные вызовы с теми же аргументами.

Пример 4: Использование extract() для преобразования массива в переменные

Пример
<?php
$data = ['name' => 'Анна', 'age' => 30];
extract($data);
echo $name;  // Анна
echo $age;   // 30
?>
Анна30

Осторожно:

extract() может перезаписать существующие переменные. Рекомендуется использовать третий параметр EXTR_SKIP или EXTR_PREFIX_ALL.

Пример 5: Проверка на существование переменной с помощью isset() и empty()

Пример
<?php
$test = 0;

if (isset($test)) echo 'isset true';     // true, потому что переменная определена
if (empty($test)) echo 'empty true';     // true, потому что 0 считается пустым
?>
isset trueempty true

empty() эквивалентна !isset($var) || $var == false. Для точной проверки на null используйте is_null().

Пример 6: Присваивание по ссылке для массивов

Пример
<?php
$original = ['a', 'b', 'c'];
$reference = &$original;
$reference[] = 'd';
echo count($original);  // 4, потому что изменился тот же массив
?>
4

Без ссылки $original остался бы с тремя элементами.

Пример 7: Глобальные переменные внутри функции с использованием $GLOBALS

Пример
<?php
$var = 'внешняя';

function change() {
    $GLOBALS['var'] = 'измененная';
}
change();
echo $var;  // измененная
?>
измененная

Массив $GLOBALS содержит все глобальные переменные. Изменение его элемента меняет оригинал.

Пример 8: Константы, определённые с помощью const, и их использование в HTML-шаблонах

Пример
<?php
const MAX_UPLOAD = 10 * 1024 * 1024; // 10 МБ

$filesize = 5 * 1024 * 1024;
if ($filesize < MAX_UPLOAD) {
    echo 'Файл подходит';
} else {
    echo 'Файл слишком большой';
}
?>
Файл подходит

Константы видны во всех областях видимости, их не нужно объявлять как global.

переменные в PHP - comments

En
Php var (php)