Область видимости переменных в PHP
В PHP переменные имеют область видимости, определяющую, где они доступны в коде. Узнайте о глобальной, локальной и статической областях видимости.
Область видимости переменной — это та часть программы, где переменная видна и может использоваться. В PHP область видимости определяется местом объявления переменной: переменная, созданная на верхнем уровне скрипта, является глобальной, а переменная, созданная внутри функции, является локальной для этой функции. Важно отметить — и это удивляет тех, кто пришёл из JavaScript или Python, — что PHP-функции не видят автоматически переменные из окружающего скрипта. Каждая функция получает собственный набор приватных переменных.
На этой странице рассматриваются три области видимости, необходимые в повседневном PHP: глобальная, локальная и статическая, — а также два способа обратиться к глобальному значению из функции (global и $GLOBALS) и когда лучше использовать передачу аргументов.
Локальные переменные
Переменная, объявленная внутри функции, имеет локальную область видимости: она существует только во время выполнения этой функции и невидима за её пределами. Это область видимости по умолчанию, и именно её следует использовать чаще всего, поскольку она делает функции самодостаточными и предсказуемыми.
<?php
function myFunction() {
$x = 10; // local to myFunction()
echo $x; // works: prints 10
}
myFunction();
echo $x; // Warning: Undefined variable $x
?>Второй echo завершается ошибкой, потому что $x никогда не существовала за пределами функции. Обратное тоже верно: $x, определённая в главном скрипте, не видна внутри myFunction(), если вы явно не передадите её туда. Локальные переменные идеально подходят для счётчиков, промежуточных результатов и всего временного, что не должно «утекать» в остальную часть программы.
Глобальные переменные
Переменная, объявленная на верхнем уровне скрипта — вне каких-либо функций — имеет глобальную область видимости. Несмотря на название, она не становится автоматически доступной внутри функций. Чтобы прочитать или изменить её внутри функции, необходимо явно подключить её с помощью ключевого слова global.
Без строки global $x; переменная $x внутри функции была бы отдельной, неопределённой локальной переменной. Ключевое слово global связывает локальное имя с глобальным, поэтому изменения внутри функции влияют и на значение снаружи.
Массив $GLOBALS
PHP также хранит все глобальные переменные во встроенном суперглобальном массиве $GLOBALS, индексируя их по имени переменной. Поскольку суперглобальные переменные видны в любой области видимости, это даёт второй способ обратиться к глобальной переменной без ключевого слова global:
<?php
$x = 5;
$y = 10;
function addNumbers() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addNumbers();
echo $z; // Outputs 15
?>Здесь $z создаётся в глобальной области видимости из внутренней части функции. $GLOBALS удобен, когда нужно обратиться к нескольким глобальным переменным одновременно, однако у него те же недостатки, что и у global.
Используйте глобальные переменные осторожно
Глобальные переменные создают скрытые зависимости: любая функция может их изменить, что затрудняет отслеживание ошибок. Предпочтительнее передавать значения через аргументы и возвращать результаты — это делает входные и выходные данные каждой функции явными:
<?php
function addNumbers($a, $b) {
return $a + $b;
}
echo addNumbers(5, 10); // Outputs 15
?>Прибегайте к global или $GLOBALS только для действительно общепрограммной конфигурации, а не как к замене передачи данных.
Статические переменные
Обычно локальная переменная уничтожается при возврате из функции, поэтому при следующем вызове она начинает с нуля. Статическая переменная является исключением: объявленная с ключевым словом static, она сохраняет своё значение между вызовами, оставаясь при этом локальной (невидимой за пределами функции). Она идеально подходит для запоминания состояния между вызовами — например, для подсчёта количества запусков функции.
Инициализатор static $x = 0; выполняется только при первом вызове; при последующих вызовах PHP пропускает его и использует сохранённое значение.
Статические переменные объявляются с помощью ключевого слова static и доступны только внутри функции, в которой они объявлены.
Заключение
Таким образом, переменные в PHP имеют область видимости, определяющую, где они могут быть доступны и использованы. Понимание различных типов областей видимости — глобальной, локальной и статической — помогает писать более эффективный и понятный код. Используя подходящую область видимости для переменных, вы можете сделать код организованным и простым в сопровождении.