Локальні і глобальні змінні
Ми неодноразово стикалися в цій книзі з локальними і глобальними змінними. Локальні змінні доступні тільки у функції, а глобальні — доступні у всій програмі. Вони доступні всім функціям. У лістингу 8.5 приведений невеликий приклад:
Лістинг 8.5.Использование глобальних і локальних змінних
$i = 10;
$g = 7;
function fl ()
{
$x = 5;
5i = 0; global $g;
echo "g = $g\n"; echo "i = $i\n";
fi();
echo "$x\n";

Мал. 8.3. Локальні і глобальні змінні
Змінні $i і $g — глобальні, вони доступні у всій програмі. Для передачі глобальних змінних у функцію використовується інструкція global:
global список змінних
Якщо ми не виконаємо цю інструкцію, наша функція не дістане доступ до змінній $g. Звернете увагу на дві змінні $i: одна з них глобальна, а інша — локальна (у тілі функції).
У функції використовуватиметься локальна змінна, проте, якщо ми оголосимо змінну глобальної:
global $g, $i;
то використовуватиметься значення глобальної змінної. Спробуйте змінити функцію fl (див. перед. лістинг 8.5) так (див. лістинг 8.6):
Лістинг 8.6. Некоректне використання глобальних і локальних змінних
<?
$i = 10; $g = 7;
function fl () {
$i = 5;
echo $i; // виведе 5
global $i;
echo $i; // виведе 10
} fl();
?>
Змінна $х є локальною і недоступна в основній програмі, тому ми отримаємо повідомлення про те, що дана змінна не визначена (див. мал. 8.3).
Якщо функція змінить значення глобальної змінної, то значення змінної буде змінено і в основній програмі.
Приклад:
<?
$g = 5;
function fl() { global $g; $g » 10; );
fl();
echo $g; // виведе 10
?>
Ми вже говорили про масив SGLOBALS, тому я не стану повторюватися, а лише скажу, що локальні змінні функцій не є елементами даного масиву.
8.7. Статичні змінні
Окрім локальних і глобальних змінних, в PHP існує ще один тип змінних — статичні. Якщо в тілі функції оголошена статична змінна, то компілятор її не видалятиме після завершення роботи функції. Наступний приклад демонструє роботу із статичною змінною:
<?
function fl() ( static $x; $x++; echo "Sx "; }
for ($i=0; $i++<5; ) fl();
?>
Наступний сценарій виведе рядок 1 2 3 4 5. Якщо видалити інструкцію static, буде виведений рядок 1 1 1 1 1, тому що змінна $х віддалятиметься при завершенні роботи функції і обнулятиметься при кожному її виклику. Чому 1 1 1 1 1, а не 0 0 0 0 0? Змінна $х инкре-ментируется відразу після обнулення, а тільки потім виводиться. Статичні змінні не є елементами SGLOBALS.