Kontext ("scope") proměnné
Kontext
proměnné
je
oblast
,
ve
které
je
definována
.
Většina
proměnných
v
PHP
má
pouze
jediný
kontext
.
Ten
zahrnuje
i
soubory
vložené
pomocí
"
include
"
nebo
"require
"
.
Například
:
Zde
bude
proměnná
$a
dostupná
ve
vloženém
skriptu
b.inc
.
Avšak
uvnitř
uživatelsky
definovaných
funkcí
se
zakládá
jejich
lokální
kontext
.
Jakákoli
proměnná
použitá
uvnitř
funkce
je
implicitně
omezena
na
tento
místní
kontext
.
Například
:
Tento
skript
nevyprodukuje
žádný
výstup
,
protože
konstrukt
"
echo
"
odkazuje
na
lokální
verzi
proměnné
$a
,
a
ta
nemá
v
tomto
kontextu
přiřazenu
žádnou
hodnotu
.
Můžete
si
všimnout
,
že
to
je
trochu
jiné
než
v
jazyce
C
,
kde
jsou
globální
funkce
automaticky
dostupné
ve
funkcích
,
pokud
nejsou
specificky
zastíněny
lokální
definicí
.
To
může
způsobit
problémy
tím
,
že
člověk
může
nechtěně
změnit
globální
proměnnou
.
V
PHP
musí
být
globální
proměnné
deklarovány
uvnitř
funkce
jako
globální
,
pokud
se
v
ní
mají
používat
.
Příklad
:
Výše
uvedený
skript
vytiskne
"
3
"
.
Deklarací
$a
a
$b
ve
funkci
jako
globálních
proměnných
se
dosáhne
toho
,
že
při
odkazování
na
proměnné
se
pracuje
s
jejich
globální
verzí
.
Počet
globálních
proměnných
,
se
kterými
lze
ve
funkci
manipulovat
,
není
omezen
.
Druhým
způsobem
,
jak
přistupovat
k
proměnným
z
globálního
kontextu
,
je
použití
speciálního
pole
$GLOBALS
,
definovaného
v
PHP
.
Předchozí
příklad
lze
přepsat
:
Pole
$GLOBALS
je
asociativní
pole
s
názvem
globální
proměnné
jako
klíčem
a
obsahem
příslušné
proměnné
jako
obsahem
elementu
pole
.
Jinou
důležitou
vlastností
rozlišování
kontextů
proměnných
je
možnost
používání
static
proměnných
.
Statická
proměnná
existuje
pouze
v
lokálním
kontextu
funkce
,
ale
neztrácí
svoji
hodnotu
,
pokud
provádění
programu
tento
kontext
opustí
.
Uvažujme
následující
příklad
:
Tato
funkce
je
poněkud
neužitečná
,
neboť
při
každém
volání
nastavuje
$a
na
0
a
tiskne
"
0
"
.
Konstrukt
$a
++
,
který
inkrementuje
proměnnou
,
nemá
žádný
význam
,
protože
při
skončení
vykonávání
funkce
se
obsah
proměnné
$a
ztrácí
.
Aby
měla
funkce
skutečný
význam
čítače
a
hodnota
se
neztrácela
,
deklaruje
se
proměnná
$a
jako
statická
:
Nyní
se
při
každém
volání
funkce
Test(
)
vytiskne
hodnota
proměnné
$a
a
inkrementuje
se
.
Statické
proměnné
také
poskytují
způsob
,
jak
řešit
rekurzívní
funkce
.
Rekurzívní
funkce
je
taková
funkce
,
která
volá
sama
sebe
.
Psaní
rekurzívních
funkcí
je
třeba
věnovat
zvláštní
péči
,
protože
může
vzniknout
nekonečný
cyklus
volání
.
Musíte
se
ujistit
,
že
máte
rekurzi
adekvátně
ukončenu
.
Následující
jednoduchá
funkce
rekurzívně
počítá
do
10
za
použití
statické
proměnné
$count
ke
zjištění
okamžiku
pro
ukončení
: