Menu

Переменные в PHP: объявление, область видимости, global

Переменная PHP начинается с $ и создаётся присваиванием: $name = "Ada";. Ключевого слова для объявления и фиксированного типа нет. Функции не видят внешние переменные, если их не передать, не объявить через global или не захватить; static сохраняет значение между вызовами.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Переменная PHP это имя, начинающееся с $, и создаётся она присваиванием значения: $name = "Ada";. Ключевого слова для объявления нет, и тип указывать не нужно, потому что тип определяет значение. Позже можно присвоить значение другого типа.

Правила именования переменных

Имя переменной начинается с $, затем идёт буква или подчёркивание, а дальше любые буквы, цифры и подчёркивания. Не-ASCII буквы тоже считаются буквами, поэтому $名前 допустимо, хотя обычно используют ASCII-имена. Имена чувствительны к регистру.

ИмяДопустимо?
$total, $userName, $user_nameда
$_count, $item2да
$2itemsнет, не может начинаться с цифры
$user-nameнет, это $user минус name
$thisнет, зарезервировано для текущего объекта; присваивание вызывает фатальную ошибку

Значит, $city, $City и $CITY это три разные переменные. Используйте snake_case ($first_name) или camelCase ($firstName) и держитесь одного стиля в проекте. Стандарты PSR намеренно не регламентируют имена переменных; в коде Laravel и Symfony в основном используют camelCase.

Переменные внутри строк

В двойных кавычках PHP заменяет переменные их значениями, в одинарных нет. Оборачивайте переменную в фигурные скобки, если сразу за ней идут буквы или если вы обращаетесь к элементу массива по строковому ключу:

Кавычки, конкатенация и интерполяция подробно описаны на странице про строки.

Неопределённые переменные и значения по умолчанию

Чтение переменной, которой ничего не присваивали, даёт null, а ваш PHP напечатает предупреждение:

Warning: Undefined variable $discount in /home/index.php on line 3

Сначала проверьте через isset или используйте оператор объединения с null ??, чтобы задать значение по умолчанию. Оба способа работают без предупреждения:

$x ??= 0; это короткая форма $x = $x ?? 0;. Обычный случай это значения из формы и URL: $page = $_GET['page'] ?? 1;.

Область видимости в функциях

Переменные, объявленные вне функции, внутри неё не видны, а переменные, созданные внутри функции, исчезают, когда она возвращает управление. Для тех, кто пришёл из JavaScript, это самый частый сюрприз:

Без ?? 0 первая функция выдала бы предупреждение о неопределённой $taxRate. Передача значений через параметры делает функции предсказуемыми и удобными для тестирования, и это первое, к чему стоит прибегать. Параметры и возвращаемые значения описаны на странице про функции.

Ключевое слово global и $GLOBALS

Если функции действительно нужна глобальная переменная, объявите её через global или обратитесь через массив $GLOBALS, который хранит все глобальные переменные по имени:

Глобальные переменные усложняют чтение кода, потому что любая функция может их изменить. Они встречаются в старом коде и плагинах WordPress (global $wpdb;); в новом коде передавайте значения явно или используйте класс.

Статические переменные сохраняют значение

Переменная static внутри функции создаётся один раз и сохраняет значение между вызовами. При этом она остаётся локальной: код вне функции её не видит.

Переменные переменных ($$name)

$$name использует значение $name как имя другой переменной. Это работает, но массивы почти всегда решают ту же задачу понятнее:

<?php
$field = "color";
$$field = "blue";        // creates $color
echo $color, "\n";

// The clearer way to have names chosen at runtime:
$settings = [];
$settings[$field] = "blue";
echo $settings["color"], "\n";

Копия или ссылка

Присваивание одной переменной другой копирует значение, в том числе массивы. Поставьте & перед переменной, чтобы оба имени указывали на одно и то же значение:

Объекты ведут себя иначе: при присваивании копируется дескриптор того же объекта, поэтому изменения через любую переменную видны через обе. Для настоящей копии используйте clone.

Частая ошибка: переменная, заданная внутри if или цикла

В PHP нет блочной области видимости, поэтому переменная, созданная внутри if, for или foreach, существует и после блока. Это удобно, но скрывает ошибку: если блок не выполнился, переменная так и не была создана.

Без строки со значением по умолчанию пустой $orders оставил бы $message неопределённой, и PHP напечатал бы предупреждение. Давайте каждой переменной значение до блока, который может её задать.

Часто задаваемые вопросы

Как объявить переменную в PHP?

Присвойте значение имени, которое начинается с $: $count = 10;. В PHP нет ключевых слов var или let и нет типа в объявлении; переменная создаётся при первом присваивании и получает тип своего значения.

Почему функция не видит переменную, объявленную снаружи?

У функций PHP своя локальная область видимости, и глобальные переменные они автоматически не видят. Передайте значение параметром (самый чистый вариант), объявите global $name; внутри функции или читайте $GLOBALS['name']. Замыкания могут захватить её через use ($name), а стрелочные функции fn() захватывают автоматически.

Что такое статическая переменная в PHP?

Локальная переменная, объявленная внутри функции со словом static, например static $calls = 0;. Она инициализируется один раз и сохраняет значение между вызовами функции, что удобно для счётчиков и простых кешей.

Чувствительны ли имена переменных PHP к регистру?

Да. $name, $Name и $NAME это три разные переменные. А вот имена функций и классов в PHP к регистру не чувствительны.

Как удалить переменную в PHP?

Вызовите unset($name);. После этого isset($name) вернёт false, а чтение выдаст предупреждение "Undefined variable". Присваивание null оставляет переменную, но делает её пустой.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ