Forum und email
Kontext ("scope") proměnné

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:

$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 ní 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--;
}