Változók hatóköre
A hatókör megmondja, hogy az adott változó, hol érhető el programunkban, azaz meddig terjed a hatóköre. Nagyon fontos megértenünk ennek a működését.
Az első csoportba a beépített szuper globális változók (superglobal variables) tartoznak. Ezekről röviden beszéltem már ebben a cikkben. Annyit jegyezzünk meg most róluk, hogy nem hiába hívják őket szuper globálisnak: az adott oldalon, ahol használjuk, bárhol elérhetőek.
A második csoport a globális változók. Ezek azok a változók, amelyeket létrehozunk egy adott oldalon, mint "sima" változókat. Ezek elérhetőek az egész oldalon, kivéve a függvények belsejét. Lássuk egy példán keresztül:
<?php
$valtozo = "Én egy változó vagyok.";
function hatokor_teszt_2() {
if (isset($valtozo)) {
echo "Látható vagyok egy függvény belsejében!" . "<br />";
} else {
echo "Láthatatlan vagyok egy függvény belsejében!" . "<br />";
}
}
hatokor_teszt_2(); // Meghívjuk a függvényt
echo 'A $valtozo értéke: ' . $valtozo . '<br />';
?>
És az eredmény:
Láthatatlan vagyok egy függvény belsejében!
A $valtozo értéke: Én egy változó vagyok.
A program elején létrehozzuk a $valtozo nevű változót, amely így globális változóvá válik. A hatokor_teszt_2() függvényt használjuk arra, hogy megnézzük, a belsejében látható-e a változónk. Ehhez az isset() függvényt használjuk, amelyet már a korábbi cikkekből ismerhetünk. Mivel a globális változók nem láthatóak a függvények belsejében, ezért az isset() függvény hamis eredményt ad, így a "Láthatatlan vagyok egy függvény belsejében!" üzenetet kapjuk.
A program végén egy echo utasítással kiírjuk a $valtozo értékét, hogy lássuk, a változónkat a függvényen kívül bárhol használhatjuk.
A harmadik csoportba azok a változók tartoznak, amelyeket egy függvény belsejében hozunk létre, ugyanazzal a névvel mint a globális változó és létrehozásukkor használjuk a global kulcsszót.
Ezek a változók gyakorlatilag ugyanúgy viselkednek mint a globális változók, azzal a különbséggel, hogy a függvények belsejében is elérhetőek, és szabadon módosíthatóak:
<?php
$valtozo = "Én egy változó vagyok.";
function hatokor_teszt_3() {
global $valtozo;
if (isset($valtozo)) {
echo "Látható vagyok egy függvény belsejében!" . "<br />";
} else {
echo "Láthatatlan vagyok egy függvény belsejében!" . "<br />";
}
echo 'A $valtozo értéke a függvény belsejében: ' . $valtozo . '<br />';
$valtozo = "A függvény belsejében módosítottuk a változó értékét!";
}
hatokor_teszt_3(); // Meghívjuk a függvényt
echo 'A $valtozo értéke: ' . $valtozo . '<br />';
?>
Az eredmény:
Látható vagyok egy függvény belsejében!
A $valtozo értéke a függvény belsejében: Én egy változó vagyok.
A $valtozo értéke: A függvény belsejében módosítottuk a változó értékét!
A negyedik csoportba kerülnek a lokális változók. Ezeket függvények belsejében hozzuk létre, hatókörük és életciklusuk addig tart, amíg a függvény feldolgozás alatt van (fut), utána megszűnnek létezni:
<?php
function hatokor_teszt_4() {
$fuggveny_valtozo = "Én egy lokális változó vagyok.";
if (isset($fuggveny_valtozo)) {
echo "Létezem a függvény belsejében!" . "<br />";
} else {
echo "Nem létezem a függvény belsejében!" . "<br />";
}
echo 'A $fuggveny_valtozo értéke a függvény belsejében: ' .
$fuggveny_valtozo . '<br />';
}
hatokor_teszt_4(); // Meghívjuk a függvényt
if (isset($fuggveny_valtozo)) {
echo "Létezem a függvényen kívül!" . "<br />";
} else {
echo "Nem létezem a függvényen kívül!" . "<br />";
}
?>
Az eredmény pedig:
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: Én egy lokális változó vagyok.
Nem létezem a függvényen kívül!
Az ötödik csoportba a függvények belsejében létrehozott statikus változókat soroljuk. Ezek hasonlóak a lokális változókhoz, azaz csak a függvény belsejében léteznek, azonban a statikus változók megtartják az értéküket a függvény végrehajtása után is. Azaz, ha újra meghívjuk a függvényt, a statikus változó értéke ugyanaz, mint az előző függvény végrehajtása után, szemben a lokális változókkal, ahol a változók megszűnnek létezni miután befejeződött a függvény végrehajtása. Létrehozásukhoz a static kulcsszót használjuk:
<?php
function hatokor_teszt_5() {
static $fuggveny_valtozo = 1;
if (isset($fuggveny_valtozo)) {
echo "Létezem a függvény belsejében!" . "<br />";
} else {
echo "Nem létezem a függvény belsejében!" . "<br />";
}
echo 'A $fuggveny_valtozo értéke a függvény belsejében: ' .
$fuggveny_valtozo . '<br />';
// Megnöveljük a változó értékét
$fuggveny_valtozo = $fuggveny_valtozo + 1;
}
hatokor_teszt_5(); // Meghívjuk a függvényt
if (isset($fuggveny_valtozo)) {
echo "Létezem a függvényen kívül!" . "<br />";
} else {
echo "Nem létezem a függvényen kívül!" . "<br />";
}
// ötször meghívjuk a függvényt
for ($i = 1; $i <= 5; $i++) {
hatokor_teszt_5();
}
?>
Az eredmény:
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 1
Nem létezem a függvényen kívül!
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 2
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 3
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 4
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 5
Létezem a függvény belsejében!
A $fuggveny_valtozo értéke a függvény belsejében: 6
Amint láthatjuk, a változó nem érhető el a függvényen kívül, azonban az értéke megmarad.
Az utolsó, hatodik csoport amit tárgyalunk, azok a konstansok (állandó változók). A konstansok olyanok, mint a változók, azzal a különbséggel, hogy ha egyszer értéket adtunk nekik, akkor azon már nem tudunk változtatni. A másik különbség, hogy nevük elé nem kell $ jel.
Konstansokat a define() függvénnyel tudunk létrehozni:
define("BLOGNEV", "simplePHP");
A konstansoknak csupa nagybetűvel szokás írni a nevüket, bár ez nem követelmény, de érdemes követni ezt a konvenciót, mert így könnyebb megkülönböztetni őket a sima változóktól.
A konstansok globális változók, elérhetőek a teljes oldalon, és a függvények belsejében is:
<?php
define("BLOGNEV", "simplePHP");
function hatokor_teszt_6() {
if (defined("BLOGNEV")) {
echo "Létezem a függvény belsejében!" . "<br />";
} else {
echo "Nem létezem a függvény belsejében!" . "<br />";
}
echo 'A konstans értéke a függvény belsejében: ' . BLOGNEV . '<br />';
}
hatokor_teszt_6(); // Meghívjuk a függvényt
if (defined("BLOGNEV")) {
echo "Létezem a függvényen kívül!" . "<br />";
} else {
echo "Nem létezem a függvényen kívül!" . "<br />";
}
echo 'A konstans értéke a függvényen kívül: ' . BLOGNEV . '<br />';
?>
Az eredmény:
Létezem a függvény belsejében!
A konstans értéke a függvény belsejében: simplePHP
Létezem a függvényen kívül!
A konstans értéke a függvényen kívül: simplePHP
Amint a fenti példában láthatjuk, a konstansok meglétét nem az isset() függvénnyel ellenőrizzük, hanem a defined() függvénnyel.