Переменные в 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.