Вы здесь: Главная > Основы разработки сайта > Основы PHP > 24 урок - Область видимости переменной

Основы PHP

24 урок - Область видимости переменной

В php существует две области видимости. Локальная и глобальная.

 Пример кода:

<?php
$gl = 'глобальная переменная';
function sayHello () {
    $loc = 'локальная переменная';
    echo 'Привет я функция – в локальной области видимости и я '.$loc.'<br/>';
    }
sayHello();
// Глобальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$gl.'<br/>';
//Локальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$loc.'<br/>';
?>

Все что входит в глобальную видимость кода это вот:

<?php
$gl = 'глобальная переменная';
function sayHello ( // Именно так!
sayHello();
// Глобальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$gl.'<br/>';
//Локальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$loc.'<br/>';
?>

Все остальное, что осталось от исходного кода, это локальная область видимости. Следовательно, переменная $gl – это глобальная переменная, а переменная $loc – это локальная переменная. Переменные объявленные в локальной области видимости, не видны в глобальной! Следовательно, при выводе через оператор echo переменную $loc – он не вывел! 

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

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

Есть решение этой задачи. И решений таких, всего два.

Первое:

Объявить переменную в функции с помощью ключевого слова global. Вот как это выглядит в коде:

<?php
$gl = 'глобальная переменная';
function sayHello () {
    global $loc; // Объявляем что она глобальная.
    $loc = 'Теперь я глобальная переменная.';
    echo 'Привет я функция – в локальной области видимости и я '.$loc.'<br/>';
    }
sayHello();
// Глобальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$gl.'<br/>';
//Локальная переменная
echo 'Привет – Я в глобальной области видимости и я '.$loc.'<br/>';
?>

Теперь переменная $loc глобальная и следовательно она выводиться через оператор echo!

Рассмотрим второй вариант. Но чтобы его рассмотреть, надо сначала разобраться в устройстве php. Значит смотрите, когда мы создаем переменную и присваиваем ей значение:

 
$age = 25;
 

А php делает это по-другому. У него есть свой массив $GLOBALS[] в котором хранятся все переменные. Когда мы пишем вот так вот: $age = 25; PHP на самом деле делает вот так:

 
$GLOBALS['age'] = 25;
 

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

<?php
$a = 1; 
$b = 2;
function Sum(){
    global $a, $b;
    $b = $a + $b;
    }
Sum();
echo $b; //Выведет 3
?>

Заменим global:

<?php
$a = 1;
$b = 2;
function Sum(){
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
    }
Sum();
echo $b; //Выведет 3
?>

Ответ тот же самый! Следовательно, способ работает.

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

Допустим есть функция:

<?php
function Test() {
    $a = 0;
    echo $a++;
    }
Test(); // 0
Test(); // 0 
Test(); // 0
?>

Почему выдается ноль ? Опять же, всё что находиться в функции не сохраняется! Но чтобы работало, нам необходимо сделать переменную статической. Объявив ее ключевым словом static и задав ей какое-то значение!

<?php
function Test() {
    static $a = 0;
    echo $a++;
    }
Test(); // 0
Test(); // 1 
Test(); // 2
?>

Уже выводит, как и должно. 0 1 2 и тд в зависимости от количества вызова функции.