[Ezt a fejezetet érdemes elolvasnod, még akkor is, ha profi vagy valamilyen programozási nyelvben, mert a PHP tartogat egy-két érdekes meglepetést...]
Egy változó hatásköre az a környezet, amiben a változó definiált. A legtöbb esetben minden PHP változónak egy hatásköre van. Ez az egyetlen hatáskör kiterjed az include és a require segítségével használt fájlokra is. Például:
Itt az $a változó elérhető lesz az include-olt b.inc szkriptben is. Felhasználói függvényeken belül egy lokális függvényhatáskör lép érvénybe. Minden egyes függvényen belül használt változó csak azon a bizonyos függvényen belülre van korlátozva. Például:
Ez a szkript nem fog semmilyen kimenetet sem eredményezni, mivel az echo kifejezés az $a változónak egy helyi változatára utal, és ehhez még nem került hozzárendelésre érték abban a hatáskörben. Bizony, bizony, ez egy "kicsit" különbözik a C nyelv filozófiájától, ahol egy globális változó automatikusan elérhető bármely függvényből, feltéve ha a függvényben újra nem definiáltad azt a változót. Ez bizony problémák forrása lehet, ha az ember véletlenül megváltoztat egy globális változót. A PHP-ben a globális változókat global kulcsszóval deklarálni kell a függvényekben, ha szeretnénk őket a függvényben használni. Például:
A fenti szkript kiírja, hogy "3". $a és $b global-ként való deklarálásával minden utalás ezekre a változókra a globális változót fogja érinteni. Nincs megkötés arra, hogy hány globális változó hatáskörét lehet "becsempészni" a függvénybe.
Globális változók elérésének másik módja a PHP által definiált speciális $GLOBALS tömb használata. Az előbbi példát így is meg lehetett volna írni:
$a = 1; $b = 2; function Osszead() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Osszead(); echo $b; |
A $GLOBALS tömb egy asszociatív tömb, ahol a globális változó neve a kulcs, és a változó az értéke.
Egy másik fontos tulajdonsága a változók hatáskörének a static (statikus) változó. Egy statikus változó csak lokális hatáskörben él - egy függvényen belül, de két függvényhívás közt nem felejti el az értékét (pontosabban megfogalmazva a változó hatásköréből való kilépés esetén is megmarad az értéke). Figyeld csak:
Ez egy veszettül haszontalan hülye függvény, ami nem csinál mást, mint minden meghívásakor $a-t 0-ra állítja, aztán kiírja a 0-t. Az $a++ teljesen felesleges, mert amint vége a függvénynek, az $a változót tároló bitek felveszik a néhai előnevet. Ahhoz, hogy egy értelmes számolást tudjunk végezni, és megmaradjon a számláló értéke, az $a változót statikusnak kell deklarálni:
Most, valahányszor meghívódik a Test() függvény, kiírja $a-t, majd megnöveli eggyel.
A statikus változók biztosítanak egy módot, hogy a rekurzív függvényekkel bánjunk. Rekurzív az a függvény, amely saját magát meghívja [persze jobb esetben illik feltételhez kötni, különben a szótárban nem úgy fog szerepelni, hogy Rekurzió: ld. rekurzió, hanem úgy, hogy Rekurzió = Stack overflow]. Szóval csak óvatosan azokkal a rekurzív függvényekkel, nehogy végtelen rekurzióba kerüljünk. Ezért kell a feltétel, mert az fogja leállítani a rekurziót. A következő függvény rekurzívan elszámol 10-ig a statikus $count változó segítségével. [Ki ne felejtsd a static kulcsszót, mert akkor nagy baj lesz!]: