Локальні і глобальні змінні Ми неодноразово стикалися в цій книзі з локальними і глобальними змінними. Локальні змінні доступні тільки у функції, а глобальні — доступні у всій програмі. Вони доступні всім функціям. У лістингу 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.