Область видимости переменной в PHP. Что такое локальные, глобальные и статические переменные?

область видимости переменной в php. что такое локальные, глобальные и статические переменные?

Понимание областей видимости

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

На самом деле, работая с функциями, утверждение, приведенное выше, не совсем верно. Функции имеют свою область видимости переменных. К примеру, две переменные с именем «$test», определенные в теле функции и вне её, являются различными и существуют отдельно друг от друга. PHP при вызове функции создает для неё «отдельное пространство». Как только её выполнение завершится, это пространство обнуляется и бесследно исчезает.

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

//Переменная с текстом приветствия, определенная за
//пределами функции
$text = 'Добро пожаловать, дорогой друг!';

//Определение функции выводящей приветствие на экран
function showMessage() {
    echo $text;
}

//Вызов функции покажет пустой экран, так как она не
//имеет доступа к переменной $text
showMessage();

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

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

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

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

//Определение глобальных переменных для использования
//внутри функции
$country = 'Австралия';
$capital = 'Канберра';

//Определение функции выводящей сообщение на экран
function showMessage() {
    global $country, $capital;

    echo 'Столицей страны '. $country .' является '.$capital;
}

//Функция получит доступ к глобальным переменным и
//выведет полное сообщение на экран.
ShowMessage();

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

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

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

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

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

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

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

//Определение функции использующей статическую переменную
// и выводящей свой результат в браузер
function performanceCount() {
    static $count = 0;
    $count = $count + 1;

    echo $count .'<br>';
}

//Делаем несколько вызовов функции подряд
performanceCount(); //Результат: 1
performanceCount(); //Результат: 2
performanceCount(); //Результат: 3
performanceCount(); //Результат: 4
performanceCount(); //Результат: 5

Вас может смутить, что в статической переменной $count, вначале каждого выполнения присваивается значение «0», а затем к нему прибавляется единица. Ведь при такой реализации функция всегда должна возвращать единицу. Дело в том, что стартовое значение статической переменной задается всего один раз, при определении функции, а не при вызове. Просто представьте, что при вызовах эта строчка отсутствует вовсе.

Последние публикации