Все ленты — последние статьи

Область видимости переменных PHP. Все, что вы хотели знать, но боялись спросить.

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

Когда приступаешь к изучению PHP и начинаешь работать с функциями и объектами, область видимости переменных вызывает некоторое смущение. К счастью правила PHP в этом отношении очень просты для понимания (в сравнении с другими языками программирования).
Что такое область видимости?

 

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

Глобальная — к переменным можно получить доступ в любом месте скрипта
Локальная — к переменным можно получить доступ только внутри функции, в которой они были определены

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

Переменные с глобальной областью видимости называются глобальными, а с локальной областью видимости — локальными.

Вот пример того, как работают глобальные и локальные переменные.
01 <?php
02
03 $globalName = "Зоя";
04
05 function sayHello() {
06 $localName = "Гарри";
07 echo "Привет, $localName!<br>";
08 }
09
10 sayHello();
11 echo "Значение $globalName: '$globalName'<br>";
12 echo "Значение $localName : '$localName'<br>";
13
14 ?>

При выполнении скрипт выведет:
1 Привет, Гарри!
2 Значение $globalName: 'Зоя'
3 Значение $localName : ''

В данном скрипте мы создали две переменных:

$globalName — это глобальная переменная
$localName — это локальная переменная, которая создана внутри функции sayHello().

После создания переменной и функции скрипт вызывает sayHello(),который выводит 'Привет, Гарри!'. Затем скрипт пытается вывести значения двух переменных с помощью функции echo. Вот что происходит:

Так как $globalName была создана вне функции, она доступна в любом месте скрипта, поэтому выводится 'Зоя'.
$localName будет доступна только внутри функции sayHello(). Так как выражение echo находится вне функции, PHP не дает доступа к локальной переменной . Вместо этого, PHP предполагает, что код будет создавать новую переменную с именем $localName, которая получит значение по умолчанию — пустую строку. вот почему второй вызов echo выводит значение '' для переменной $localName.

Доступ к глобальным переменным внутри функции

Для получения доступа к глобальной переменной вне функции достаточно просто написать ее имя. Но для получения доступа к глобальной переменной внутри функции, нужно сначала объявить переменную как глобальную в функции с помощью ключевого слова global:
1 function myFunction() {
2 global $globalVariable;
3 // Доступ к глобальной переменной $globalVariable
4 }

Если не сделать этого, то PHP предполагает, что вы создаете или используете локальную переменную.

Вот пример скрипта, который использует глобальную переменную внутри функции:
01 <?php
02
03 $globalName = "Зоя";
04
05 function sayHello() {
06 $localName = "Гарри";
07 echo "Привет, $localName!<br>";
08
09 global $globalName;
10 echo "Привет, $globalName!<br>";
11 }
12
13 sayHello();
14
15 ?>

При выполнении скрипт выведет:
1 Привет, Гарри!
2 Привет, Зоя!

Функция sayHello() использует ключевое слово global для объявления переменной $globalName как глобальной. После чего она может получить доступ к переменной и вывести ее значение ('Зоя').
Что такое суперглобалы?

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

Вот список суперглобалов, доступных в PHP версии 5.3:

$GLOBALS — список всех глобальных переменных в скрипте (исключая суперглобалов)
$_GET — содержит список всех полей формы, отправленной браузером с помощью запроса GET
$_POST — содержит список всех полей формы отправленной браузером с помощью запроса POST
$_COOKIE — содержит список всех куки, отправленных браузером
$_REQUEST — содержит все сочетания ключ/значение, которые содержатся в массивах $_GET, $_POST, $_COOKIE
$_FILES — содержит список всех файлов, загруженных браузером
$_SESSION — позволяет хранить и использовать переменные сессии для текущего браузера
$_SERVER — содержит информацию о сервере, такую как, имя файла выполняемого скрипта и IP адрес браузера.
$_ENV — содержит список переменных среды, передаваемых PHP, например, CGI переменные.

Например, можно использовать $_GET для того, чтобы получить значения переменных заключенных в строке URL запроса скрипта, и вывести их на странице:
1 <?php
2
3 $yourName = $_GET['yourName'];
4 echo "Привет, $yourName!";
5
6 ?>

Если вы запустите выше приведенный скрипт с помощью строки URL http://www.example.com/script.php?yourName=Фред, то он выведет:

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

Суперглобал $GLOBALS очень удобно использовать, так как он дает возможность организовать доступ к глобальным переменным в функции без необходимости использования ключевого слова global. Например:
01 <?php
02
03 $globalName = "Зоя";
04
05 function sayHello() {
06 echo "Привет, " . $GLOBALS['globalName'] . "!<br>";
07 }
08
09 sayHello(); // Выводит "Привет, Зоя!"
10
11 ?>
Статические переменные: они находятся где-то рядом

Когда вы создаете локальную переменную внутри функции, она существует только пока работает функция. При завершении функции локальная переменная исчезает. Когда функция вызывается снова, создается новая локальная переменная.

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

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

Для создания статической переменной в функции нужно использовать ключевое слово static перед именем переменной и обязательно задать ей начальное значение. Например:
1 function myFunction() {
2 static $myVariable = 0;
3 }

Рассмотрим ситуацию, когда удобно использовать статическую переменную. Допустим, вы создаете функцию, которая при вызове создает виджет и выводит количество уже созданных виджетов. Можно попробовать написать такой код с использованием локальной переменной:
01 <?php
02
03 function createWidget() {
04 $numWidgets = 0;
05 return ++$numWidgets;
06 }
07
08 echo "Создаем некие виджеты…<br>";
09 echo createWidget() . " мы уже создали.<br>";
10 echo createWidget() . " мы уже создали.<br>";
11 echo createWidget() . " мы уже создали.><br>";
12
13 ?>

Но, так как переменная $numWidgets создается каждый раз при вызове функции, то мы получим следующий результат:
1 Создаем некие виджеты…
2 1 мы уже создали.
3 1 мы уже создали.
4 1 мы уже создали.

Но с использованием статической переменной, мы сможем сохранять значение от одного вызова функции к другому:
01 <?php
02
03 function createWidget() {
04 static $numWidgets = 0;
05 return ++$numWidgets;
06 }
07
08 echo "Создаем некие виджеты…<br>";
09 echo createWidget() . " мы уже создали.<br>";
10 echo createWidget() . " мы уже создали.<br>";
11 echo createWidget() . " >мы уже создали.<br>";
12
13 ?>

Теперь скрипт выдаст ожидаемый результат:
1 Создаем некие виджеты…
2 1 мы уже создали.
3 2 мы уже создали.
4 3 мы уже создали.

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

Вот и все! Почаще обращайтесь к документации по PHP.