W3docs

Область видимости переменных в 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.

php— editable, runs on the server

Без строки 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 пропускает его и использует сохранённое значение.

php— editable, runs on the server

Статические переменные объявляются с помощью ключевого слова static и доступны только внутри функции, в которой они объявлены.

Заключение

Таким образом, переменные в PHP имеют область видимости, определяющую, где они могут быть доступны и использованы. Понимание различных типов областей видимости — глобальной, локальной и статической — помогает писать более эффективный и понятный код. Используя подходящую область видимости для переменных, вы можете сделать код организованным и простым в сопровождении.

Практика

Практика
Каковы некоторые характеристики переменных в PHP?
Каковы некоторые характеристики переменных в PHP?
Was this page helpful?