Переменная 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 оставляет переменную, но делает её пустой.