PHP: Область видимости переменных

В этой главе:

  • Локальные переменные
  • Глобальные переменные
  • Статические переменные
  • Суперглобальные переменные

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

1
2
3
4
5
6
<?php
 
  $a = 1;
  include 'b.inc';
   
?>

В этом примере переменная $a будет доступна также внутри включенного скрипта - b.inc.

Локальные переменные

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

В примере ниже наглядно демонстрируется, что переменная, объявленная за пределами функции, не изменяется внутри функции. Пока не стоит стремиться понять, как работает функция, главное, что она имеет свой уникальный набор переменных:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
  /* глобальная область видимости */
     
  $age = 30;  // присвоить переменной age значение 30
 
  function birth() {
    // присвоить переменной age значение 1
    $age = 1;  // это локальная переменная - она видна только внутри функции
  }
     
  // Вызов функции
  birth();
     
  // выводим значение переменной age
  echo $age// => 30
   
?>

В результате исполнения этого фрагмента будет выведено: 30.

Внутри функции birth выполняется присваивание переменной $age значения 1, но это не таже самая переменная, что была определена в глобальной области видимости. Поэтому, когда выполняется вывод на экран значения переменной $age, выводится первоначальное значение 30. Стоит отметить, что локальные переменные создаются в момент вызова функции и удаляются после окончания работы функции.

Если вы на самом деле захотите прочитать или изменить значение глобальной переменной (так называются переменные используемые в глобальной области видимости), а не локальной внутри функции birth, она должна быть объявлена глобальной внутри определения функции.

Глобальные переменные

Глобальные переменные позволяют вам пересекать границы между функциями, чтобы обращаться к значениям переменных. Ключевое слово global указывает, что данная переменная будет той же самой переменной повсюду в программе, то есть глобальной переменной. Изменение глобальной переменной внутри функции можно наблюдать за ее пределами. Не существует никаких ограничений на количество глобальных переменных, которые могут обрабатываться функцией:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
  // присвоим переменной age значение 30
  $age = 30;
 
  // определяем функцию
  function birth() {
    // определить переменную как глобальную
    global $age;
      
    // увеличиваем значение переменной age на 1
    $age = $age + 1;
  }
  // вызываем функцию
  birth();
 
  //выводим значение переменной age
  echo $age;
   
?>

В результате исполнения этого кода будет выведено: 31.

Глобальные переменные следует использовать в редких случаях, поскольку легко изменить значение переменной по ошибке, не предусмотрев последствий. Ошибки такого типа бывает очень сложно обнаружить. Кроме того, когда мы будем изучать функции подробнее, вы узнаете, что есть и другой способ передачи значений в функции и получения результатов их работы. Все это означает, что в действительности вы не должны использовать глобальные переменные.

Есть еще второй способ доступа к переменным глобальной области видимости - использование специального, определяемого PHP массива $GLOBALS:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
  $a = 1;
  $b = 2;
 
  function Sum() {
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
  }
 
  Sum();
  echo $b;
 
?>

$GLOBALS - это ассоциативный массив, ключами которого являются имена глобальных переменных, а значениями - содержимое глобальных переменных. $GLOBALS существует в любой области видимости, это объясняется тем, что $GLOBALS является суперглобальным.

Если в некоторой функции вам потребуется применить такую переменную, которая не теряет свое значение каждый раз по завершении работы функции, но при этом вы не хотите использовать глобальную переменную, следует использовать статическую переменную.

Статические переменные

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 
  // определение функции
  function birth() {
    // определяем переменную age как статическую
    static $age = 0;
     
    //увеличиваем значение age на 1
    $age = $age + 1;
     
    // выводим на экран значение переменной
    echo "Значение статической переменной: $age<br>";
  }
 
  // вызываем дважды функцию
  birth();
  birth();
 
?>

В результате будет выведено:

Значение статической переменной: 1
Значение статической переменной: 2

Как вы могли заметить, теперь значение переменной $age сохраняется между вызовами функции birth. Это значение будет существовать, пока выполнение программы не завершится.

Замечание: статические переменные имеют одну особенность, во время объявления переменной (ее инициализации), ей может быть присвоено только статическое значение. Попытка присвоить этим переменным значения, являющиеся результатом выполнения работы выражений, вызовет ошибку обработки:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
  function foo() {
    static $x = 5;          // верно (статическое значение)
    static $x = 1+2;        // неверно  (поскольку это выражение)
    static $x = sqrt(121);  // неверно  (поскольку это тоже выражение)
 
    $x++;
    echo $x;
  }
 
?>

И так, нам осталось рассмотреть еще один тип переменных - суперглобальные переменные.

Суперглобальные переменные

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

Суперглобальные переменные - являются встроенными переменными, которые всегда доступны во всех областях видимости, поэтому нет необходимости использовать синтаксис global $variable; для доступа к ним в функциях и методах.

Стоит отметить, что суперглобальные переменные определены как массивы (подробно о массивах мы поговорим позднее). Ниже представлен полный список суперглобальных переменных:

Имя переменнойОписание
$GLOBALS Содержит все глобальные переменные, доступные локальному сценарию. Имена переменных используются в качестве индексов массива.
$_SERVER Содержит информацию об окружении веб-сервера.
$_GET Содержит информацию о запросах GET (при отправке форм). Эти значения следует обязательно проверять перед использованием.
$_POST Содержит информацию о запросах POST (другой тип отправки данных формы). Эти значения следует обязательно проверять перед использованием.
$_FILES Содержит информацию о файлах, загружаемых методом POST.
$_COOKIE Содержит информацию о cookies HTTP
$_SESSION Содержит информацию из всех переменных, зарегистрированных в рамках сессии.
$_REQUEST Содержит информацию о пользовательском вводе. Эти значения следует обязательно проверять перед использованием. Вместо этого массива следует использовать $_GET или $_POST, т.к. они более специализированные.
$_ENV Содержит информацию об окружении сценариев.

Приведем простой пример:

1
2
3
4
5
<?php
 
  echo $_SERVER['PHP_SELF'];
   
?>

В результате выполнения этого кода будет показано имя файла в котором расположен исполняемый сценарий.