Przy korzystaniu z funkcji i klas pojawia się problem zasięgu
zmiennych. Problem ten dotyczy większości języków programowania.
Ogólnie mówiąc chodzi o to, że zmienne dostępne są zazwyczaj tylko
w tym zasięgu, w którym zostały zdeklarowane. Przez zasięg rozumiem
zasięg główny (to znaczy część kodu, która nie należy do żadnej
funkcji lub klasy), klasy i funkcje.
Przykład 6.5. Zasięg zmiennych
<?php $a = 34; function aaa() { echo $a; } aaa(); ?>
|
Pomimo, że zmienna $a została zadeklarowana
wcześniej, to nic się nie wyświetli, ponieważ zmienna $a nie jest
dostępna wewnątrz funkcji. Dostęp do zmiennych globalnych można
uzyskać na 2 sposoby. Po pierwsze, można powiadomić PHP że dana
zmienna ma być pobierana z zasięgu głównego za pomocą instrukcji
global.
Przykład 6.6. Zmiana zasięgu zmiennej
<?php $a = 23; function aaa() { global $a; echo ; } aaa(); ?>
|
W tym przykładzie zostanie wyświetlona prawidłowa wartość zmiennej $a.
Istnieje też druga metoda dostania się do zmiennych globalnych. W każdym
miejscu kodu dostępna jest tablica asocjacyjna $GLOBALS, której kluczami są
nazwy zmiennych dostępnych w zasięgu głównym.
Istnieje jeszcze jeden aspekt dotyczący zasięgu zmiennych: zmienne statyczne.
Przykład 6.7. Zmienna statyczna
<?php function aaa() { $a = 0; echo $a; $a++; } aaa(); aaa(); aaa(); ?>
|
Powyższy przykład jest w zasadzie bez sensu - za każdym razem
wyświetlona będzie wartość 0, ponieważ za każdym wywołaniem funkcji
zmienna $a będzie od nowa inicjowana wartością 0 a po wyświetleniu
i inkrementacji tej zmiennej będzie ona niszczona (wszystkie
zmienne inicjowane w funkcji oprócz statycznych są niszczone po
wykonaniu się funkcji).
Przykład 6.8. Zmiana zasięgu zmiennej
<?php function aaa() { static $a = 0; echo $a; $a++; } aaa(); aaa(); aaa(); ?>
|
Natomiast w tym przykładzie wyświetlone zostaną wartości 0, 1 i 2. Dzieje się
tak, ponieważ mimo że zmienna jest inicjowana wartością 0, to dzięki
instrukcji static dzieje się to tylko raz, a do tego po zakończeniu
wykonywania się funkcji zmienna ta nie jest niszczona.
W PHP 4.1.0 wprowadzone zostały tak zwane tablice
superglobalne. Są one tworzone przez PHP - użytkownik
nie może samemu tworzyć takich tablic. Zawierają one dane
przekazywane do PHP metodami GET, POST, informacje o przekazanych
plikach, dane z ciasteczek i sesji - odpowiedno
$_GET, $_POST,
$_FILES, $_COOKIE,
$_SESSION. Mają one zastąpić tablice
$HTTP_*_VARS, które ze względu na kompatybilność
są jeszcze obecne. Różnica między tablicami superglobalnymi a tymi
używanymi wcześniej jest taka, że tablice superglobalne dostępne są
w dowolnym miejscu kodu, bez potrzeby użycia instrukcji global.