2015. ápr 17.

Változók hatóköre

írta: Bozzai Gyula
Változók hatóköre

radar_01.jpg

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.

Szólj hozzá

echo for global static if else konstans local define defined isset hatókör