Область видимості змінної

Область видимості змінної – це контекст, у якому ця змінна визначена. У більшості випадків всі змінні PHP мають лише одну область видимості. Ця єдина область видимості охоплює також файли, що включаються (include) і необхідні (require). Наприклад:

Loading...

Тут змінна $a буде доступна всередині скрипта b.inc. Однак визначення (тіло) функції користувача задає локальну область видимості даної функції. Будь-яка змінна за умовчанням обмежена локальною областю видимості функції. Наприклад:

Loading...

Цей скрипт видасть діагностику невизначеної змінної E_WARNING(или**E_NOTICE** до версії PHP 8.0.0. Однак якщо в налаштуваннях INI display_errors встановлено приховування такої діагностики, нічого виводитися нічого очікувати. Це з тим, що оператор echo вказує на локальну версію змінної $a, а межах цієї області видимості їй було присвоєно значення. Можливо ви помітили, що це трохи відрізняється від мови C у тому, що глобальні змінні C автоматично доступні функціям, якщо тільки вони не були перезаписані локальним визначенням. Це може викликати деякі проблеми, оскільки люди можуть ненароком змінити глобальну змінну. У PHP, якщо глобальна змінна буде використовуватися всередині функції, вона повинна бути оголошена глобальною всередині визначення функції.

Ключевое словоglobal

Сначала Приклад использованияglobal :

Приклад #1 Использованиеglobal

Loading...

Наведений вище скрипт виведе 3. Після визначення $a і $b всередині функції як global всі посилання будь-яку з цих змінних будуть вказувати їх глобальну версію. Немає жодних обмежень на кількість глобальних змінних, які можуть оброблятися функцією.

Другий спосіб доступу до змінних глобальної області видимості - використання спеціального, що визначається PHP масиву $GLOBALS. Попередній приклад може бути переписаний так:

Приклад #2 Использование$GLOBALS замість global

Loading...

$GLOBALS - це асоціативний масив, ключем якого є ім'я, а значенням – вміст глобальної змінної. Зверніть увагу, що $GLOBALS існує в будь-якій області видимості, це пояснюється тим, що $GLOBALSявляетсясуперглобальним. Нижче наведено приклад, що демонструє можливості суперглобальних змінних:

Приклад #3 Суперглобальні змінні та область видимості

Loading...

Зауваження :

Використання ключового слова global поза функцією не є помилкою. Він може бути використаний у файлі, який включається всередині функції.

Використання статичних (static) змінних

Інший важливою особливістю області видимості змінної є статична змінна. Статична змінна існує тільки в локальній області видимості функції, але не втрачає свого значення, коли виконання програми виходить із цієї області видимості. Розглянемо наступний приклад:

Приклад #4 Демонстрація необхідності статичних змінних

Loading...

Ця функція досить марна, оскільки при кожному виклику вона встановлює $a в і виводить . Інкремент змінної $a++ тут ​​не відіграє ролі, тому що при виході з функції змінна $a зникає. Щоб написати корисну функцію підрахунку, яка не втрачатиме поточного значення лічильника, змінна $a оголошується як static:

Приклад #5 Приклад використання статичних змінних

Loading...

Тепер $a буде проініціалізована тільки при першому виклику функції, а кожен виклик функції test() буде виводити значення $a та інкрементувати його.

Статичні змінні також дозволяють працювати з рекурсивними функціями. Рекурсивною є функція, що викликає саму себе. При написанні рекурсивної функції слід бути уважним, оскільки є можливість зробити рекурсію нескінченною. Ви повинні переконатися, що є адекватний спосіб завершення рекурсії. Наступна проста функція рекурсивно рахує до 10, використовуючи для визначення моменту зупинки статичну змінну $count:

Приклад #6 Статичні змінні та рекурсивні функції

Loading...

Статичним змінним можна присвоїти значення, що є результатом виразу, але не можна використовувати для цього функцію, так це викликає помилку аналізу.

Приклад #7 Оголошення статичних змінних

Loading...

Починаючи з PHP 8.1.0, коли метод, що використовує статичні змінні, успадковується (але не перевизначається), успадкований метод тепер використовуватиме статичні змінні спільно з батьківським методом. Це означає, що статичні змінні в методах тепер поводяться так само, як і статичні властивості.

Приклад #8 Використання статичних змінних у успадкованих методах

Loading...

Зауваження :

Статичні оголошення обчислюються під час компіляції скрипту.

Посилання з глобальними (global) та статичними (static) змінними

PHP використовує модифікатори змінних static і global як посилання. Наприклад, реальна глобальна змінна, впроваджена область видимості функції вказівкою ключового слова global, Насправді створює посилання на глобальну змінну. Це може призвести до несподіваної поведінки, як це показано в наступному прикладі:

Loading...

Результат виконання наведеного прикладу:

NULL
object(stdClass)#1 (0) {
}

Аналогічно поводиться і вираз static. Посилання не зберігаються статично:

Loading...

Результат виконання наведеного прикладу:

Loading...

Цей приклад демонструє, що при привласненні посилання статичної змінної вона не запам'ятовується, коли ви викликаєте функцію &get_instance_ref() вдруге.