Область видимості змінної
Область видимості змінної – це контекст, у якому ця змінна визначена. У більшості випадків всі змінні 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()
вдруге.