Kontext ("scope") proměnné

Kontext proměnné je oblast , ve které je definována . Většina proměnných v PHP pouze jediný kontext . Ten zahrnuje i soubory vložené pomocí " include " nebo "require " . Například :

 
$a

 
=

 
1

 
;

 
include

 
"b.inc"

 
;



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 :

 
$a

 
=

 
1

 
;

 
/

 
*

 
globální

 
kontext

 
*

 
/

 
function

 
Test(

 
)

 
{

 
echo

 
$a

 
;

 
/

 
*

 
odkaz

 
na

 
proměnnou

 
v

 
lokálním

 
kontextu

 
*

 
/

 
}

 
Test()

 
;



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 mají používat . Příklad :

 
$a

 
=

 
1

 
;

 
$b

 
=

 
2

 
;

 
function

 
Sum(

 
)

 
{

 
global

 
$a

 
,

 
$b

 
;

 
$b

 
=

 
$a

 
+

 
$b

 
;

 
}

 
Sum()

 
;

 
echo

 
$b

 
;



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 :

 
$a

 
=

 
1

 
;

 
$b

 
=

 
2

 
;

 
function

 
Sum(

 
)

 
{

 
$GLOBALS["b"

 
]

 
=

 
$GLOBALS["a"

 
]

 
+

 
$GLOBALS["b"]

 
;

 
}

 
Sum()

 
;

 
echo

 
$b

 
;



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 :

 
function

 
Test

 
(

 
)

 
{

 
$a

 
=

 
0

 
;

 
echo

 
$a

 
;

 
$a++

 
;

 
}



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á :

 
function

 
Test(

 
)

 
{

 
static

 
$a

 
=

 
0

 
;

 
echo

 
$a

 
;

 
$a++

 
;

 
}



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í :

 
function

 
Test(

 
)

 
{

 
static

 
$count

 
=

 
0

 
;

 
$count++

 
;

 
echo

 
$count

 
;

 
if

 
($count

 
10

 
)

 
{

 
Test

 
()

 
;

 
    }

 
$count--

 
;

 
}